PowerShell สำหรับผู้เริ่มต้น (ตอนที่ 8): พลังของ PowerShell – การติดต่อกับวัตถุ (รับสมาชิก เลือกวัตถุ)
หลังจากส่วน PowerShell สำหรับผู้เริ่มต้น (ตอนที่ 7): The Pipe (และตัวอย่างอีกมากมายให้เล่น) ตอนนี้เราจะมุ่งเน้นไปที่วัตถุ พื้นฐานที่คุณสามารถสร้างได้ แต่ก่อนที่เราจะมาดูคำตอบของแบบฝึกหัดสุดท้ายในส่วนนี้กันก่อน นอกจากนี้เรายังจะมีการทบทวนอย่างรวดเร็วถึงสิ่งที่เราได้เรียนรู้ไปแล้วในส่วนที่ 7
สามารถดูทุกส่วนของซีรีส์ได้ที่นี่: PowerShell สำหรับผู้เริ่มต้น (ซีรีส์)
ทบทวน (ตอนที่ 7)
เรียกใช้ Get-Hotfix แสดงเฉพาะหมายเลข (KB) ของโปรแกรมแก้ไขด่วนและวันที่ติดตั้งในรูปแบบรายการ
นี่คือแบบฝึกหัดของส่วนที่ 7 โอเค เราต้องเรียกใช้ Get-Hotfix จากนั้นเราจะต้องจัดรูปแบบเอาต์พุตในรูปแบบรายการและแสดงเพียงสองสิ่งเท่านั้น ชื่อและวันที่ติดตั้ง สำหรับสิ่งนี้เราจำเป็นต้องมีไปป์ไลน์
มาทำทีละขั้นตอนกัน
เมื่อคุณเรียกใช้ Get-Hotfix โดยไม่มีพารามิเตอร์ใด ๆ คุณจะสามารถเห็นชื่อส่วนหัวได้ (ขอเรียกพวกเขาว่าแอตทริบิวต์ของวัตถุ ข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้เพิ่มเติมด้านล่าง) ตอนนี้เรามีชื่อแล้ว เป็นเรื่องง่ายที่จะใส่คำสั่งที่ซับซ้อนกว่านี้ด้วยไพพ์
นี่เราอยู่.
ทบทวน
ไปป์จะนำทุกอย่างทางด้านซ้ายของไปป์และส่งต่อไปยังคำสั่งทางด้านขวาของไปป์ Format-Table, Format-List และ Format-Wide จะปรับเอาต์พุตของคำสั่ง
สัมผัสถึงพลังของ PowerShell แบบอิงวัตถุ
PowerShell เป็นแบบเชิงวัตถุ สิ่งนี้หมายความว่าอะไรและสิ่งนี้นำมาซึ่งอะไร? ในสภาพแวดล้อมเชิงวัตถุมีคนทำบางอย่างให้คุณแล้ว ช่างเป็นคนดีจริงๆ นั่นคือใคร? ฉันไม่รู้. แน่นอนว่าเป็นผู้พัฒนา Micrsosoft หรือหลาย ๆ คน ?
ฉันไม่สามารถพูดได้ดีไปกว่า Bruce Payette ผู้เขียน Windows PowerShell in Action (รุ่นที่สอง):
คุณใช้วัตถุที่คนอื่นกำหนดไว้สำหรับคุณ
ประเด็นคืออะไร? ผมขอยกตัวอย่างให้คุณฟัง คุณรู้จัก ipconfig อย่างแน่นอน มันเป็นคำสั่งให้แสดงการตั้งค่า IP ของคุณ Ipconfig ส่งออกข้อความธรรมดา
จนถึงตอนนี้ดีมาก จะทำอย่างไรถ้าคุณต้องการแสดงเฉพาะที่อยู่ IPv4? ใช่ ฉันได้ยินคุณตะโกนออกมาดังๆ: “เป็นไปได้ ใช้การค้นหา” ตกลงมาทำกัน
ตอนนี้สมมติว่าเราต้องการเฉพาะที่อยู่ IPv4 และที่อยู่ IPv6 ในรูปแบบตาราง ตอนนี้มันเริ่มซับซ้อนมาก เป็นความพยายามอย่างมากในการส่งออกหรือเรียกรายการเดียวจากการส่งออกข้อความ
ตกลง คำสั่งที่เทียบเท่ากับ ipconfig คือ Get-NetIPAddress
และตอนนี้ดูสิ่งนี้:
อันที่สองหวานกว่ามาก ฉันขอยกตัวอย่างอื่นให้คุณ: dir ใน cmd และ Get-ChildItem ใน PowerShell
Dir (หากป้อนเป็น cmd) จะแสดงข้อความธรรมดา
รับ ChildItem ส่งออกวัตถุ
หมายเหตุด้านข้าง: หากคุณเรียกใช้ dir ใน PowerShell Get-ChildItem จะถูกดำเนินการ นี่อาจทำให้สับสนเล็กน้อย
นี่เป็นการชิมเล็กน้อยสำหรับหัวข้อที่กำลังจะมาถึง รับ ChilIdtem และวัตถุในการดำเนินการ
Get-ChildItem -File C:\Temp | Select-Object Name,LastWriteTime,CreationTime,Directory,Length
ตอนนี้เราจะเจาะลึกเกี่ยวกับ PowerShell Objects
การค้นพบสิ่งที่มีคนกำหนดไว้ให้คุณแล้ว (Get-Member, Select-Object)
เราจะเน้นไปที่ตัวอย่างข้างต้นต่อไป ฉันได้ดำเนินการตามคำสั่งแล้ว
Get-ChildItem -File C:\Temp | Select-Object Name,LastWriteTime,CreationTime,Directory,Length
ตอนนี้เรามาดูผลลัพธ์ "ปกติ" ของ Get-ChildItem กัน มันแสดงโหมด, LastWriteTime, ความยาวและชื่อ
ฉันจะรู้ได้อย่างไรว่ามีมากกว่านี้? (CreationTime, ไดเร็กทอรี)?
ฉันได้ดูล่วงหน้าเพื่อดูว่าเกิดอะไรขึ้นกับคำสั่ง Get-Member
Get-ChildItem | Get-Member
และที่นั่นฉันพบคุณลักษณะ 2 ประการ:
จากนั้นฉันก็ใช้คุณลักษณะนี้
Get-Member cmdlet รับคุณสมบัติและวิธีการของออบเจ็กต์
พลังของ PowerShell คือการวางแนววัตถุ นี่คือสิ่งที่ทำให้ PowerShell แตกต่างจากเครื่องมืออื่นๆ มากมาย คุณต้องจัดการกับวัตถุ มิฉะนั้น คุณจะไม่มีวันตระหนักถึงพลังของ PowerShell
ใช้ Get-Member เพื่อสำรวจวัตถุ
คุณสมบัติและวิธีการคืออะไร?
รู้เบื้องต้นเกี่ยวกับคุณสมบัติและวิธีการ (รับสมาชิก)
ฉันได้กล่าวไปแล้วว่ามีมากขึ้น เราสามารถทำอะไรได้มากกว่าด้วย PowerShell จากนั้นจึงเรียกใช้คำสั่งง่ายๆ PowerShell เป็นแบบเชิงวัตถุ มีคุณสมบัติและวิธีการ มาดูคุณสมบัติกันก่อน ตกลง ฉันขอเน้นย้ำถึงความสำคัญของสิ่งที่เรากำลังทำอยู่ตอนนี้ ฉันอ้างว่า: คุณไม่มีโอกาสเข้าใจแม้แต่ความช่วยเหลือหากคุณไม่คุ้นเคยกับวัตถุ คุณไม่เชื่อฉันเหรอ?
Get-Date เป็นคำสั่งที่ง่าย แต่ถ้าคุณดูตัวอย่าง คุณจะเห็นว่าตัวอย่างกำลังจัดการกับวัตถุอยู่แล้ว ... หากคุณเรียกใช้ Get-Help Get-Date -Online และเลื่อนไปที่ตัวอย่างที่ 4 และ 5 และคุณไม่เข้าใจว่าเกิดอะไรขึ้นที่นั่น ถ้าอย่างนั้นคุณก็เดือดร้อน
Get-Help Get-Date -Online
ทั้งหมดนี้หมายความว่าอย่างไร? ความหมายของจุดคืออะไร และวงเล็บคืออะไร และฉันจะรู้ได้อย่างไรว่าจะดูที่ไหน
หากคุณไม่เข้าใจความช่วยเหลือ คุณจะเป็นคน PowerShell ที่ดีได้อย่างไร ฉันหวังว่าฉันจะยั่วยวนคุณสักหน่อย ? เอาล่ะ มาเริ่มกันเลย
เราแยกแยะระหว่างคุณลักษณะและวิธีการ
คุณลักษณะ - วัตถุ คืออะไร
คุณสมบัติจะแสดงให้คุณเห็นว่าวัตถุคืออะไร วัตถุอาจเป็นสีเขียว อาจเป็นวันที่ อาจเป็นจริงหรือเท็จ หรืออย่างอื่น
ลองใช้ตัวอย่างของ Get-Volume
Get-Member แสดงคุณลักษณะทั้งหมดของคำสั่ง Get-Volume และคุณต้องใช้ท่อ
Get-Volume | Get-Member -MemberType Properties
ตอนนี้เราสามารถเรียกคุณสมบัติเหล่านั้นได้แล้ว วิธีที่ดีที่สุดในการทำเช่นนี้คือการใช้ Select-Object สมมติว่าเราต้องการแสดงอักษรระบุไดรฟ์ ขนาด และขนาดที่เหลืออยู่ โดยวิธีการ: อย่าลืมใช้ TAB
Get-Volume | Select-Object DriveLetter,Size,SizeRemaining
ตัวอย่างอื่น. ความเร็วลิงก์ของการ์ดเครือข่ายของคุณคือเท่าใด
Get-NetAdapter | Get-Member -MemberType property
คุณจะพบคุณสมบัติ LinkSpeed
Get-NetAdapter | Select-Object LinkSpeed
โอเค เรามาหยุดที่นี่กัน เราต้องการสิ่งนี้เพื่ออะไร? ตัวอย่าง. คุณต้องการบันทึกชื่อไฟล์ทั้งหมดไว้ในไฟล์เดียว สำหรับสิ่งนี้ เราจำเป็นต้องมีรายชื่อไฟล์ทั้งหมด และเฉพาะชื่อเท่านั้น ชื่อเท่านั้น! เราจะได้ชื่อทั้งหมดได้อย่างไร? ขั้นตอนที่ 1 คือการค้นหาคุณลักษณะของชื่อไฟล์
Get-ChildItem C:\Temp | Get-Member -MemberType property
คุณจะพบคุณสมบัติที่เรียกว่า FullName นี่เราอยู่.
Get-ChildItem -Path C:\Temp\ | Select-Object FullName
และบันทึกเป็นไฟล์…
Get-ChildItem C:\Temp\ | Select-Object FullName | Out-File C:\Temp\test.txt
สำหรับส่วนนี้ สิ่งสำคัญเพียงอย่างเดียวคือคุณต้องจำไว้ว่ามีแอตทริบิวต์และสามารถแสดงได้ด้วย Get-member
เพื่อเน้นย้ำความสำคัญของหัวข้อนี้: รู้ว่าวัตถุสร้างความแตกต่างได้อย่างไร ความแตกต่างระหว่างผู้ใช้ PowerShell ปกติและผู้ใช้ PowerShell ที่ดี
สมมติว่าเจ้านายของคุณต้องการมีรายชื่อเซิร์ฟเวอร์ทั้งหมดในโดเมนของคุณ เราควรทำอย่างไรตอนนี้? จับภาพหน้าจอ? กำลังซื้อเครื่องมือของบุคคลที่สามใช่ไหม ไม่จำเป็น. ใช้ PowerShell
Get-ADComputer -Filter {operatingsystem -like '*server*'} | Select-Object Name | Out-File C:\Temp\servers.txt
นำรายชื่อนี้ไปมอบให้เจ้านายของคุณ
ต้องการรายการโปรแกรมแก้ไขด่วนที่ติดตั้งทั้งหมดในรูปแบบ HTML หรือไม่ เรียกใช้ PowerShell
Get-HotFix | Select-Object HotFixID,InstalledOn | ConvertTo-Html | Set-Content C:\Temp\hotfixes.htm
แต่รอสักครู่ เราได้เรียนรู้ในตอนที่ 7 (The Pipe) ว่าเราสามารถทำสิ่งต่างๆ ได้มากมายด้วยคำสั่งรูปแบบ สิ่งนี้ใช้ได้กับ Format-Table หรือไม่ คำตอบคือใช่ แต่นั่นไม่ใช่ความคิดที่ดี
ข้อควรจำ: ใช้คำสั่งรูปแบบ (Format-Table, Format-List และ Format-Wide) ที่ส่วนท้ายเท่านั้น Select-Object คือเพื่อนของคุณเมื่อพูดถึงวัตถุ ถ้าคุณต้องการแสดงรายการข้อมูลบนหน้าจอ ให้ใช้รูปแบบตาราง สำหรับทุกสิ่งทุกอย่าง ให้ใช้ Select-Object Select-Object ส่งต่อข้อมูลตามที่เป็นอยู่ ตารางรูปแบบจะแก้ไขข้อมูลที่อาจนำไปสู่พฤติกรรมที่ไม่คาดคิด
แอตทริบิวต์จะแสดงให้คุณเห็นว่าวัตถุคืออะไร ใช้ Get-Member เพื่อสำรวจคุณลักษณะ ใช้ Select-Object เพื่อดึงข้อมูลแอตทริบิวต์ คำสั่ง Select-Object และ Format ไม่ใช่เพื่อนกัน ใช้ Format-Table/List/Wide ที่ส่วนท้ายของโค้ดเท่านั้น ใช้ Select-Object เพื่อรับวัตถุที่ไม่เปลี่ยนแปลง
วิธีการ - สิ่งที่ออบเจ็กต์สามารถทำได้ ทำได้
ลองมาตัวอย่างจากบทนำ มันแสดงความช่วยเหลือของ Get-Date ตัวอย่างส่วนใหญ่อ้างถึงคุณลักษณะ (วัตถุคืออะไร) แต่เราอยากเปลี่ยนแปลงอะไรบางอย่าง เราต้องการทำอะไรบางอย่าง ในส่วนสุดท้ายเราได้ใช้ Select-Object ในส่วนนี้เราจะใช้วิธีพิเศษ .NET คุณชอบสิ่งนี้แทนที่จะเป็น Select-Object อย่างไร
เอาล่ะ มาช้าลงกันดีกว่า คุณสามารถใช้ Select-Object หรือ a. วิธี NET() หากคุณใช้. NET มีข้อดีบางประการ พิมพ์สิ่งต่อไปนี้ใน PowerShell:
(Get-Date).
ตอนนี้กด CTRL + ช่องว่าง ว้าวมันดูดี คุณได้รับวัตถุทั้งหมดที่นำเสนอ เลือกของคุณ
วงเล็บมีไว้เพื่ออะไร? คำสั่งในวงเล็บจะดำเนินการทันที ซึ่งหมายความว่ามีค่าอยู่แล้วเมื่อคุณใช้วิธีการ โอเค มีวิธีที่เรียกว่า Adddays นับถอยหลังเจ็ดปีกันเถอะ อย่าลืมใช้ TAB เพื่อหลีกเลี่ยงการพิมพ์มากเกินไป
(Get-Date).AddYears(-7)
อีกตัวอย่างหนึ่งคือการสำรวจวิธีการทั้งหมดของคำสั่ง Get-Service
Get-Service | Get-Member -MemberType method
มีวิธีที่เรียกว่าหยุด นั่นฟังดูดี เราสามารถหยุดบริการได้ด้วยวิธีนี้
(Get-Service spooler).Stop()
ตกลง ฉันต้องยอมรับว่าการหยุดบริการโดยใช้ Stop-Service นั้นง่ายกว่า
แล้วสตริงล่ะ? ฉันเก็บชื่อของฉันไว้ในตัวแปร ตัวแปรใช้ในการจัดเก็บข้อมูล
$string='Patrick Gruenauer'
คำถามตอนนี้คือ เราสามารถทำอะไรกับชื่อนี้ได้บ้าง? สมมติว่าเราต้องการแสดงตัวอักษร 2 ตัวแรก หากคุณรู้จัก Get-Member คุณจะสามารถสำรวจวิธีการของสตริงนี้ได้
$string | Get-Member
คุณจะพบวิธี Substring ที่นั่น
$string.Substring(0,2)
ดี. หากคุณต้องการแยกชื่อและนามสกุลให้ใช้วิธีการแยก ไม่จำเป็นต้องบอกว่าคุณสามารถค้นหาวิธีนี้ได้ผ่าน Get-Member
เราต้องหาทางแยก ตัวคั่นของเราคือช่องว่างระหว่างชื่อและนามสกุลของฉัน
ตกลง ชื่อของฉันถูกเก็บไว้ใน $string ตอนนี้ฉันใช้วิธีแยก
$string.Split('')
ดี.
วิธีการสามารถเปลี่ยนแปลงหรือดำเนินการบางอย่างได้ เรียกใช้วิธี Get-Member -MemberType เพื่อสำรวจวิธีการต่างๆ ใส่คำสั่งและค่าเมธอดในวงเล็บ
ทั้งหมดนี้มีไว้เพื่ออะไร?
ฉันไม่สามารถพูดถึงมันได้มากพอ จงอดทน ในส่วนถัดไปเราจะพูดถึง WMI แล้วคุณจะสัมผัสได้ถึงพลังแห่งวัตถุ แต่ก่อนที่เราจะจบส่วนนี้ ผมขอยกตัวอย่างให้คุณทราบก่อน: ตัวอย่างที่ใช้งานได้จริงจากบล็อกของผม คุณจะได้รับรายชื่อผู้ใช้ คุณต้องการสร้างผู้ใช้จากไฟล์ข้อความนั้น
รหัสนี้อ่านยากเล็กน้อยสำหรับผู้เริ่มต้น แต่สิ่งที่ฉันอยากทำคือเน้นย้ำถึงความสำคัญของการจัดการกับวัตถุ นี่คือรายชื่อผู้ใช้
และนี่คือรหัส:
Get-Content C:\temp\users.txt | ForEach-Object {$Split = $_.Split(" "); $given=$Split[0]; $sur=$Split[1]; New-ADUser -GivenName $given -Surname $sur -Name ($given + " " + $sur) -UserPrincipalName (($sur + "@" + "$env:userdnsdomain")).ToLower() -SamAccountName ($sur).ToLower() -AccountPassword (ConvertTo-SecureString -AsPlainText "Passw00rd123" -Force) -Enabled $true -ChangePasswordAtLogon $true -Verbose}
แต่ละอ็อบเจ็กต์ในไฟล์ข้อความ (สตริง) จะถูกแยกออกจากกัน และตัวคั่นคือช่องว่าง ไม่ต้องกังวลหากคุณไม่เข้าใจคำสั่งนี้อย่างถ่องแท้ มันเป็น Active Directory คำสั่งใช้แต่ละชื่อและสร้างผู้ใช้ Active Directory ด้วยชื่อและนามสกุลที่กำหนดที่ถูกต้อง
สามารถดูบทความเต็มได้ที่นี่: PowerShell: การเพิ่มผู้ใช้ Active Directory จากไฟล์ข้อความ (เป็นกลุ่ม)
วิธีการ 2 ขั้นตอน
ปฏิบัติตามแนวทางเหล่านี้แล้วคุณจะได้รับประโยชน์เพิ่มเติมจาก PowerShell
สิ่งที่คุณต้องจำไว้คือวิธีสองขั้นตอน เชื่อฉัน.
1. สอบถามความเป็นไปได้ทั้งหมด: เรียกใช้ รับสมาชิก
Get-Date | Get-Member
2. เรียกแอตทริบิวต์หรือเมธอดด้วย (). หรือ select-object หรือ เลือก
(Get-Date -Year 1976 -Month 03 -Day 23).dayofyear
(Get-Date -Year 1976 -Month 03 -Day 23).dayofweek
(Get-Date -Year 1976 -Month 03 -Day 23).AddDays(10)
ใช่แล้ว มันเป็นวันเกิดของฉัน ใช่แล้ว ฉันอายุไม่ 20 แล้ว ใช่ ใกล้จะสิ้นสุดโพสต์นี้แล้ว ;-) ฉันมีอีกตัวอย่างหนึ่ง
อีกตัวอย่างที่ดีของวิธีการแสดงรายการคุณสมบัติของผู้ใช้ Active Directory
Get-ADUser petra -Properties * | Select-Object Name,LastLogonDate
ก่อนจะลืมการออกกำลังกายไปจนกว่าจะถึงส่วนต่อไป
ออกกำลังกาย
แค่นั้นแหละสำหรับวันนี้ นี่คือแบบฝึกหัดจนถึงส่วนถัดไป
คุณลักษณะ
สร้างไดเร็กทอรี C:\Temp1. สร้างไฟล์ข้อความ testfile1.txt ใน C:\Temp1 ใช้ PowerShell เท่านั้น หากคุณต้องการความช่วยเหลือให้ใช้ความช่วยเหลือ (Get-Help) เปิดไฟล์. ตอนนี้แสดงแอตทริบิวต์ต่อไปนี้ด้วย Select-Object หรือเทคนิคอื่น: ชื่อไฟล์ นามสกุลไฟล์ และวันที่เข้าถึงครั้งล่าสุด
วิธีการ
คำนวณย้อนหลัง 10 ปีโดยใช้ Get-Date จากวันนี้ ตอบคำถามต่อไปนี้: วันไหนของปี? (1..365?)
วิธีแก้ปัญหาสามารถพบได้ในส่วนถัดไป
พบกันใหม่ในบทความถัดไป: PowerShell สำหรับผู้เริ่มต้น (ตอนที่ 9): พลังของ WMI
แพทริค กรูเนาเออร์ MVP PowerShell



































