โฮมเพจ » ทำอย่างไร » โรงเรียน Geek ทำงานกับกลุ่มใน PowerShell

    โรงเรียน 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.