ค้นหาเว็บไซต์

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

บทความที่เกี่ยวข้อง