โรงเรียน Geek ทำงานกับกลุ่มใน PowerShell
เนื่องจาก PowerShell ใช้. Net Framework และรวมเอาเทคโนโลยีอื่น ๆ เช่น WMI และ CIM เข้าด้วยกันจึงมีมากกว่าหนึ่งวิธีในการบรรลุสิ่งเดียวกัน มาร่วมกับเราสำหรับโพสต์สั้น ๆ นี้ที่เราเรียนรู้วิธีเลือกวิธีที่ดีที่สุดในการทำงานให้สำเร็จ.
อย่าลืมอ่านบทความก่อนหน้าในซีรีย์:
- เรียนรู้วิธีอัตโนมัติของ Windows ด้วย PowerShell
- เรียนรู้การใช้ Cmdlets ใน PowerShell
- เรียนรู้วิธีใช้วัตถุใน PowerShell
- การเรียนรู้การจัดรูปแบบการกรองและการเปรียบเทียบใน PowerShell
- เรียนรู้การใช้ Remoting ใน PowerShell
- การใช้ PowerShell เพื่อรับข้อมูลคอมพิวเตอร์
และคอยติดตามตลอดซีรีย์ที่เหลือตลอดทั้งสัปดาห์.
ใช้แบทช์ Cmdlets
ก่อนหน้านี้ในซีรีส์เมื่อเราแนะนำให้คุณรู้จักกับไปป์ไลน์เราแสดงให้คุณเห็นว่าคุณสามารถนำวัตถุที่ cmdlet หนึ่งเอาท์พุตและส่งผ่านพวกมันเป็นอินพุทไปยัง cmdlet อื่นโดยใช้สิ่งนี้:
รับ - กระบวนการ - ชื่อ notepad | หยุดกระบวนการ
นี่จะฆ่ากระบวนการใด ๆ ที่มีชื่อ“ notepad” แต่คุณอาจสงสัยว่า PowerShell สามารถฆ่า notepad ทุกตัวอย่างด้วยคำสั่งเดียวได้อย่างไร คำตอบอยู่ในความช่วยเหลือของ cmdlet หยุดกระบวนการ.
ช่วยหยุดกระบวนการ - เต็ม
หากคุณดูที่บรรทัดสุดท้ายของรหัสในส่วนไวยากรณ์คุณจะเห็นว่าพารามิเตอร์ InputObject ยอมรับวัตถุประเภท Process [] และเมื่อใดก็ตามที่คุณเห็นประเภทตามด้วยวงเล็บเหลี่ยมสองอันหมายความว่าพารามิเตอร์ยอมรับ หนึ่งหรือมากกว่า ประเภทก่อนหน้า ในกรณีนี้มันยอมรับวัตถุหนึ่งหรือมากกว่าหนึ่งกระบวนการ ในทางเทคนิคเราจะบอกว่า InputObject cmdlet ยอมรับกระบวนการ แถว. เมื่อใดก็ตามที่คุณมี cmdlet ที่รองรับการใช้งานในลักษณะนี้ให้ใช้งาน นี่คือตัวเลือกอันดับหนึ่ง.
ใช้ WMI
แม้ว่า WMI ไม่ใช่เทคโนโลยีที่ดีที่สุดในการจัดส่งจาก Microsoft HQ แต่จะมาเป็นอันดับที่สองในรายการวิธีการทำงานกับคอลเลกชันของวัตถุ เราสามารถรับรายการกระบวนการที่กำลังเรียกใช้จากคลาส Win32_Process ได้อย่างง่ายดาย:
รับ -WmiObject -Class Win32_Process
เนื่องจากเคียวรี WMI ส่งคืนออบเจ็กต์ของตัวเองคุณจะต้องมองหาวิธีที่สามารถหยุดกระบวนการได้ดังนั้นให้ไพพ์ไปที่ Get-Member.
รับ -WmiObject -Class Win32_Process | ได้รับการบริการสมาชิก
ดูเหมือนว่าสิ่งที่ใกล้เคียงที่สุดที่จะหยุดคือวิธียุติดังนั้นต้องเป็นวิธี ในการเรียกใช้เมธอดบนวัตถุ WMI คุณเพียงแค่ไพพ์ไปยัง Invoke-WmiMethod และระบุชื่อของเมธอด.
Get-WmiObject -Class Win32_Process -Filter“ name = 'notepad.exe'” | เรียกใช้ -WmiMethod -Name Terminate
เยี่ยมมากนั่นเป็นกลอุบาย เมื่อใดก็ตามที่คุณได้รับ ReturnValue เป็น 0 ใน WMI เพียงจำไว้ว่าคำสั่งดำเนินการสำเร็จ.
การนับ
ความล้มเหลวในอีกสองวิธีถ้าคุณต้องทำอะไรบางอย่างกับกลุ่มวัตถุคุณสามารถระบุวัตถุทั้งหมดและดำเนินการกับแต่ละวัตถุ ก่อนอื่นคุณต้องค้นหาวิธีที่คุณจะใช้เพื่อหยุดกระบวนการเดียว.
รับกระบวนการ | รับสมาชิก - วิธีสมาชิกประเภท
สมบูรณ์แบบดูเหมือนว่าเราสามารถใช้วิธีการฆ่าแล้วสอดเข้าไปใน ForEach-Object เพื่อฆ่าพวกมันทั้งหมด.
รับ - กระบวนการ - ชื่อ notepad | ForEach-Object -Process $ _. Kill ()
ที่นี่เรานำวัตถุกระบวนการทั้งหมดที่รับกระบวนการส่งคืนและส่งพวกเขาไปยัง ForEach-Object cmdlet เช่นเดียวกับ Where-Object cmdlet เราแสดงวัตถุแต่ละชิ้นในไพพ์ไลน์ด้วย $ _ ซึ่งเราสามารถเรียกใช้วิธีการ Kill () บน ด้วยทั้งหมดที่กล่าวและทำการแจกแจงคอลเลกชันนั้นช้ากว่าวิธีการข้างต้นและควรใช้เป็นผลลัพธ์สุดท้ายเท่านั้น.
สรุป
ทางเลือกหนึ่ง
รับ - กระบวนการ - ชื่อ notepad | หยุดกระบวนการ
ทางเลือกที่สอง
Get-WmiObject -Class Win32_Process -Filter“ name = 'notepad.exe'” | เรียกใช้ -WmiMethod -Name Terminate
ทางเลือกที่สาม
รับ - กระบวนการ - ชื่อ notepad | ForEach-Object -Process $ _. Kill ()
นั่นคือทั้งหมดที่ผู้คนในครั้งนี้พบกันในสัปดาห์หน้าเพื่อความสนุกสนาน PowerShell.