PowerShell สำหรับผู้เริ่มต้น (ตอนที่ 10): การกรองและ Where-Object
เราได้เรียนรู้มากมายเกี่ยวกับ PowerShell แล้ว ครั้งล่าสุดที่เราทำงานร่วมกับ WMI: PowerShell สำหรับผู้เริ่มต้น (ตอนที่ 9): รับได้ทั้งหมดจาก Windows ด้วย PowerShell และ WMI ตอนนี้ ในความคิดของฉัน นี่เป็นเวลาที่ดีที่สุดที่จะมุ่งเน้นไปที่หัวข้อ “การกรองด้วย PowerShell” แต่ก่อนอื่นเรามาดูแบบฝึกหัดจากส่วนสุดท้ายกันก่อน
สามารถดูทุกส่วนของซีรีส์ได้ที่นี่: PowerShell สำหรับผู้เริ่มต้น (ซีรีส์)
ทบทวน (ตอนที่ 9)
นี่คืองานและวิธีแก้ปัญหาจากส่วนที่ 9:
ดึงข้อมูลเกี่ยวกับฮาร์ดดิสก์ของคุณ ใช้ Get-WmiObject หรือ Get-CimInstance ขั้นแรก ค้นหา WMI Object และเมื่อคุณพบว่ามันแสดงชื่อ พาร์ติชัน รุ่น เฟิร์มแวร์ และหมายเลขซีเรียล
ก่อนอื่น เราต้องค้นหาชื่ออินสแตนซ์ WMI เนื่องจากงานอ้างอิงถึงฮาร์ดดิสก์ เราจึงสามารถค้นหา *disk* ได้ เป็นต้น
Get-WmiObject *disk* -List
Win32_DiskDrive ฟังดูดี จำวิธีสองขั้นตอนจากตอนที่ 8 เพื่อรับประโยชน์เพิ่มเติมจาก PowerShell:
Get-CimInstance win32_diskdrive | Get-Member
คุณจะพบคุณลักษณะที่เหมาะสมที่นั่น ตอนนี้ใช้ Select-Object เพื่อรับทั้งหมด
Get-CimInstance Win32_DiskDrive | Select-Object Name,Partitions, Size,Model,FirmwareRevision,SerialNumber
ทบทวน
WMI (Windows Management Instruments) ให้การเข้าถึงแบบอ่านและเขียนการตั้งค่า Windows เกือบทั้งหมด มี cmdlet ที่สำคัญสองรายการ: Get-WmiObject และ Get-CimInstance
ทำไมต้องกรอง?
การกรองเป็นเทคโนโลยีสำคัญใน PowerShell เมื่อคุณรู้วิธีกรอง คุณจะได้รับประโยชน์จาก PowerShell มากขึ้น
งานของฉันในส่วนนี้คือการอธิบายว่าทำไมการกรองจึงมีความสำคัญ ตกลง สมมติว่าคุณมีฮาร์ดดิสก์มากกว่าหนึ่งตัว ผลลัพธ์ด้านบนจะแสดงฮาร์ดดิสก์ทั้งหมดให้คุณเห็น แต่คุณต้องการแสดงเฉพาะฮาร์ดดิสก์ของ Samsung เป็นต้น
ทำไมคุณถึงต้องการทำเช่นนี้? บางทีเจ้านายของคุณอาจถามคุณว่ามีดิสก์ Samsung ที่ใช้งานอยู่กี่ตัว บนคอมพิวเตอร์ทุกเครื่อง โปรดจำไว้ว่า WMI และ PowerShell ช่วยให้คุณสามารถทำการสืบค้นระยะไกลได้ ตกลงกลับเข้าสู่หัวข้อ เราต้องการเฉพาะ Samsung SSD ที่มี 500 GB ดูพารามิเตอร์ตัวกรอง!
Get-CimInstance Win32_DiskDrive -Filter "Model='Samsung SSD 850 EVO 500GB'" | Select-Object Name,Partitions, Size,Model,FirmwareRevision,SerialNumber
สิ่งต่อไปนี้ค่อนข้างไม่ธรรมดาและสำหรับผู้สนใจ PowerShell ขั้นสูง แต่ทำไมจะไม่ได้ล่ะ? คำสั่งต่อไปนี้รับ Samsung SSD ทั้งหมดจากคอมพิวเตอร์โดเมนทั้งหมด แต่ไม่ใช่จากเซิร์ฟเวอร์
Get-CimInstance Win32_DiskDrive -Filter "Model='Samsung SSD 850 EVO 500GB'" -ComputerName (Get-ADComputer -Filter {operatingsystem -notlike '*server*'}).Name | Select-Object Name,Partitions, Size,Model,FirmwareRevision,SerialNumber
หากเพื่อนร่วมงานของคุณคิดว่าคุณกำลังประสบปัญหาที่แก้ไขไม่ได้ เพียงแค่กดปุ่มและแสดงให้พวกเขาเห็นว่าคุณสามารถทำอะไรได้บ้าง ?
เอาล่ะ มาดูตัวอย่างสำหรับผู้เริ่มต้นกันดีกว่า
การกรองออบเจ็กต์
คุณจำคำสั่ง Get-ChildItem ได้หรือไม่? ฉันใช้คำสั่งนี้บ่อยมากในชุดนี้
หากคุณเรียกใช้ Get-Help Get-ChildItem คุณจะพบตัวอย่างการกรองมากมายในความช่วยเหลือ
Get-Help Get-ChildItem -Online
ฉันชอบใช้ความช่วยเหลือในท้องถิ่น
Get-Help Get-ChildItem -Examples
เราได้เรียนรู้อะไรบ้างจนถึงตอนนี้?
การกรองเป็นเทคโนโลยีหลักใน PowerShell เมื่อคุณเข้าใจวิธีกรองแล้ว คุณจะได้รับประโยชน์จาก PowerShell มากขึ้น
การกรองวัตถุ Active Directory
หากคุณเป็นผู้เชี่ยวชาญด้านไอที คุณอาจทำงานในสภาพแวดล้อม Active Directory การกรองเป็นเทคนิคสำคัญเมื่อทำงานกับ Active Directory Objects
คำสั่งต่อไปนี้ใช้พารามิเตอร์ Filter เพื่อรับผู้ใช้ทั้งหมดที่ถูกปิดใช้งาน:
Get-ADUser -Filter {enabled -eq 'false'} | Select-Object Name
คุณอาจสงสัยว่าฉันรู้ชื่อแอตทริบิวต์ได้อย่างไร จำวิธี 2 ขั้นตอนเพื่อใช้ประโยชน์จากออบเจ็กต์ให้มากขึ้น: 1. ใช้ Get-Member 2. ใช้ Select-Object
พารามิเตอร์ตัวกรอง
มาดูรอบๆ กันดีกว่า คำสั่งใดใช้พารามิเตอร์ตัวกรอง โปรดทราบว่าฉันอยู่บนตัวควบคุมโดเมน
Get-Command -ParameterName Filter
อย่างที่คุณเห็นพารามิเตอร์ตัวกรองส่วนใหญ่จะใช้ในคำสั่ง Active Directory และฉันต้องยอมรับว่าฉันมักจะใช้พารามิเตอร์ตัวกรองสำหรับ Active Directory เท่านั้น นั่นคือวิธีที่มันเป็น เรามาเน้นที่ Active Directory กันดีกว่า สมมติว่าเราต้องการให้คอมพิวเตอร์โดเมนทั้งหมด (ระบบปฏิบัติการเซิร์ฟเวอร์และระบบปฏิบัติการไคลเอนต์) จัดเรียงตามระบบปฏิบัติการ ในกรณีนี้เราต้องใช้พารามิเตอร์ตัวกรองที่มี *
Get-ADComputer -Filter * -Properties Name,Operatingsystem,OperatingSystemVersion,IPv4Address | Sort-Object OperatingSystem | Select-Object Name,OperatingSystem
ในแง่ของการกรอง นี่เป็นงานง่ายๆ
วิธีการกรอง
ตอนนี้เราพยายามติดตั้งคอมพิวเตอร์ทุกเครื่องที่ติดตั้ง Windows 10 สำหรับสิ่งนี้ เราต้องใส่พารามิเตอร์ตัวกรองในวงเล็บโค้ง
Get-ADComputer -Filter {operatingsystem -like '*windows 10*'}
ถึงเวลาที่จะแจกแจงรายละเอียด
วงเล็บ
ใส่ตัวกรองลงในวงเล็บโค้ง
คุณสมบัติ
ถัดไปค้นหาชื่อคุณสมบัติ (แอตทริบิวต์) เราได้พูดคุยกันแล้วใน PowerShell สำหรับผู้เริ่มต้น (ตอนที่ 8): พลังของ PowerShell - การติดต่อกับออบเจ็กต์ (รับสมาชิก เลือกออบเจ็กต์) จำวิธีสองขั้นตอน!
Get-ADComputer client01 -Properties * | Get-Member
หมายเหตุด้านข้าง: บันทึกพารามิเตอร์คุณสมบัติ ใน Active Directory คุณสมบัติบางอย่างไม่ได้แสดงตามค่าเริ่มต้น
ผู้ประกอบการ
ต่อไปใช้ตัวดำเนินการ
ตัวดำเนินการอาจเป็น -like, -as, -equal, -ne และอื่นๆ ... สำหรับข้อมูลเพิ่มเติมเกี่ยวกับประเภทพารามิเตอร์
help about_operators
ซึ่งจะเปิดไฟล์ข้อความที่จัดเก็บไว้ในคอมพิวเตอร์ของคุณ
คำแถลง
หากเราต้องการกรองบางสิ่ง เราจำเป็นต้องมีเงื่อนไข ต้องใส่เงื่อนไขนี้ในเครื่องหมายคำพูด
ทบทวน
หากคุณกำลังใช้งานตัวกรอง โปรดดูส่วนความช่วยเหลือก่อน โดยปกติตัวกรองจะอยู่ในวงเล็บ บ่อยครั้งที่มีการใช้โอเปอเรเตอร์
ตัวอย่างตัวกรองเพิ่มเติม … ไม่ต้องพูดอะไรมาก …
ค้นหาผู้ใช้ที่มีรหัสผ่านไม่ถูกต้องเป็น 0 นี่คือตัวอย่างบัญชีของ Petra:
Get-ADUser -Filter {badpwdcount -eq '0'} | Select-Object Name
ค้นหาผู้ใช้ที่มีรหัสผ่านไม่ถูกต้องนับ 0 และเปิดใช้งานอยู่ (คุณจะเห็นว่าไม่ได้เปิดใช้งาน Petra)
Get-ADUser -Filter {(badpwdcount -eq '0') -and (enabled -eq 'true')} | Select-Object Name
แสดงคอมพิวเตอร์โดเมนเซิร์ฟเวอร์ Windows ทั้งหมด แต่เฉพาะคอมพิวเตอร์ที่ใช้ Windows Server 2016 และมีชื่อขึ้นต้นด้วย DC
Get-ADComputer -Filter {(operatingsystem -like '*2016*') -and (name -like 'dc*')}
แต่บางครั้งคุณก็ต้องหาวิธีอื่น คือเมื่อไม่มีการกรอง จากนั้นเราใช้ Where-Object
การกรองด้วย Where-Object
โดยที่ Object จะอยู่ทางด้านขวาของท่อเสมอ กรองด้านซ้าย. ความหมาย ข้อดีและข้อเสียในตอนท้ายของโพสต์ ในส่วนนี้เราจะเน้นไปที่ Where-Object
นี่คือตัวอย่างบางส่วนจากวิธีใช้ PowerShell
Get-Process | Where-Object {$_.handles -gt 200 -and $_.name -eq "svchost"}
Get-ChildItem c:\scripts | Where-Object {$_.length -gt 100000}
อย่างไรก็ตาม ฉันต้องการใช้ตัวอย่างจากการมีส่วนร่วมของฉัน
Get-Hotfix | Where-Object HotfixID -like KB31*
ให้ความสนใจกับ HotFixID มันหมายถึงคุณลักษณะ
ขั้นตอนที่แนะนำ (เนื่องจากความเข้ากันได้แบบย้อนหลัง) มีลักษณะดังนี้:
Get-Hotfix | Where-Object {$_.HotfixID -like 'KB31*'}
มีอะไรใหม่ตอนนี้ $_ หมายถึงอะไร?
$_ เป็นตัวแปรที่วนซ้ำแต่ละวัตถุ/องค์ประกอบที่ส่งผ่านจากก่อนหน้า (ไปป์) พูดง่ายๆ ก็คือ: นำ hotfixID จากทุกๆ วัตถุที่มาจากไปป์
การกรองเทียบกับ Where-Object
หากไม่มีตัวกรอง ให้ใช้ Where-Object หากคุณสามารถใช้ตัวกรองทางด้านซ้ายของท่อได้ก็ใช้งานได้เลย! ทำไม มันแตกต่างกันไม่ว่าคุณจะส่งวัตถุ 1,000 ชิ้นผ่านไปป์หรือเพียง 500 ชิ้น ในกรณีของ Where-Object วัตถุทั้งหมดจะต้องผ่านไปป์ จากนั้นจึงกรองเท่านั้น จำไปป์จากตอนที่ 7: PowerShell สำหรับผู้เริ่มต้น (ตอนที่ 7): The Pipe (และตัวอย่างมากมายให้เล่น)
ทบทวน
โดยที่-Object จะอยู่ทางด้านขวาของไปป์เสมอ กรองด้านซ้าย. หากคุณมีตัวเลือกระหว่างตัวกรองทางด้านซ้ายของท่อหรือตำแหน่งวัตถุทางด้านขวา ให้เลือกด้านซ้าย
ออกกำลังกาย
นี่คือแบบฝึกหัดจนถึงส่วนถัดไป
โดยที่-Object:
ใช้ Get-Service และ Where-Object เพื่อแสดงเฉพาะบริการที่กำลังทำงานอยู่
ตัวกรอง (ต้องใช้ Active Directory):
ใช้พารามิเตอร์ตัวกรองเพื่อรับผู้ใช้ทั้งหมดที่ถูกปิดใช้งาน
พบกันใหม่ในหัวข้อ: PowerShell สำหรับผู้เริ่มต้น (ตอนที่ 11): สนุกกับ PowerShell Drives
แพทริค กรูเนาเออร์ MVP PowerShell

















