โฮมเพจ » ทำอย่างไร » โรงเรียน Geek เรียนรู้วิธีใช้งานใน PowerShell

    โรงเรียน Geek เรียนรู้วิธีใช้งานใน PowerShell

    PowerShell มีงานสี่ประเภท - งานเบื้องหลัง, งานระยะไกล, งาน WMI และงานที่กำหนด เข้าร่วมกับเราเมื่อเราทราบว่าพวกเขาคืออะไรและจะใช้งานอย่างไร.

    อย่าลืมอ่านบทความก่อนหน้าในซีรีย์:

    • เรียนรู้วิธีอัตโนมัติของ Windows ด้วย PowerShell
    • เรียนรู้การใช้ Cmdlets ใน PowerShell
    • เรียนรู้วิธีใช้วัตถุใน PowerShell
    • การเรียนรู้การจัดรูปแบบการกรองและการเปรียบเทียบใน PowerShell
    • เรียนรู้การใช้ Remoting ใน PowerShell
    • การใช้ PowerShell เพื่อรับข้อมูลคอมพิวเตอร์
    • การทำงานกับคอลเล็กชันใน PowerShell

    และคอยติดตามตลอดซีรีย์ที่เหลือตลอดทั้งสัปดาห์.

    งานพื้นหลัง

    จนถึงทุกสิ่งที่ฉันได้แสดงให้คุณเห็นใน PowerShell แบบซิงโครนัสซึ่งหมายความว่าเราพิมพ์บางอย่างลงในเชลล์และไม่สามารถทำอะไรได้มากจนกระทั่งคำสั่งนั้นดำเนินการเสร็จสิ้น นี่คือตำแหน่งที่งานแบ็คกราวน์เข้ามาในการเริ่มต้นแบ็คกราวน์งานเพียงส่งบล็อกสคริปต์ไปยัง cmdlet เริ่มงาน.

    เริ่มงาน - ชื่อ GetFileList -Scriptblock Get-ChildItem C: \ -Recurse

    ตอนนี้เรามีอิสระที่จะทำทุกอย่างที่เราต้องการภายในเชลล์ในขณะที่บล็อกสคริปต์นั้นทำงานในพื้นหลัง.

    เมื่อคุณเริ่มงานใหม่ PowerShell จะสร้างวัตถุงานใหม่ที่แสดงถึงงานนั้น คุณสามารถรับรายการของงานทั้งหมดได้ตลอดเวลาโดยเรียกใช้ cmdlet รับงาน.

    วัตถุงานจะบอกคุณเกี่ยวกับสถานะของงาน ตัวอย่างเช่นในภาพหน้าจอด้านบนเราจะเห็นว่าเรามี BackgroundJob ชื่อ GetFileList ซึ่งยังคงทำงานอยู่ แต่ได้เริ่มส่งคืนข้อมูลแล้ว หาก ณ เวลาใดก็ตามที่คุณตัดสินใจว่างานมีการใช้งานนานเกินไปคุณสามารถหยุดงานได้อย่างง่ายดายโดยการส่งไปที่ Stop-Job.

    Get-Job -Name GetFileList | หยุดงาน

    อย่างไรก็ตามเมื่อคุณหยุดงานข้อมูลใดก็ตามที่ได้รับจนกว่าจะถึงจุดที่คุณหยุดทำงาน มี gotcha แม้ว่า ใน PowerShell เมื่อคุณได้รับผลลัพธ์สำหรับงานแล้วพวกเขาจะถูกลบ เพื่อให้พวกเขายังคงอยู่คุณต้องระบุพารามิเตอร์สวิตช์สวิตช์ของการรับงาน.

    Get-Job -Name GetFileList | รับ - งาน -Keep

    เมื่อคุณทำงานเสร็จแล้วจะเป็นการดีที่สุดที่จะลบงานนั้นออก หากต้องการลบงานเพียงไปป์ที่ cmdlet ลบงาน.

    Get-Job -Name GetFileList | นำ-Job

    นี่จะเป็นการลบออกจากรายการงานที่ส่งคืนโดย Get-Job.

    งานระยะไกล

    ไม่กี่บทเรียนที่ผ่านมาเราดูว่าเราสามารถใช้การควบคุมระยะไกลเพื่อดำเนินการคำสั่ง PowerShell บนเครื่องระยะไกลโดยใช้ Invoke-Command แต่คุณรู้หรือไม่ว่าคุณสามารถใช้ Invoke-Command เพื่อเริ่มงาน remoting ในพื้นหลังได้ หากต้องการทำเช่นนั้นเพียงแค่เพิ่มพารามิเตอร์ -AsJob ลงบนท้ายคำสั่งของคุณ:

    เรียกใช้คำสั่ง - ชื่อคอมพิวเตอร์ Flash, Viper - ผู้ดูแลระบบที่น่าเชื่อถือ -ScriptBlock gci -AsJob

    นั่นเป็นคำสั่งง่าย ๆ และควรจะดำเนินการเสร็จสิ้นภายในตอนนี้ดังนั้นให้เรามาดูสถานะงานของเรา.

    อืมดูเหมือนว่ามันจะล้มเหลว นี่ทำให้ฉันเข้าสู่งาน gotcha ครั้งแรก เมื่อคุณสร้างงานใหม่ทุกประเภทใน PowerShell มันจะสร้างงานหลักหนึ่งนอกเหนือจากงานย่อยหนึ่งงานสำหรับคอมพิวเตอร์ทุกเครื่องที่คุณกำลังเรียกใช้งานอยู่ เมื่อคุณใช้งาน Get-Job cmdlet มันจะแสดงเฉพาะงานหลักและคุณสมบัติสถานะเป็นสถานการณ์กรณีที่เลวร้ายที่สุดซึ่งหมายความว่าแม้ว่าคำสั่งจะล้มเหลวในการเรียกใช้บนคอมพิวเตอร์หนึ่งร้อยเครื่องสถานะงานหลักจะพูด ล้มเหลว หากต้องการดูรายการงานลูกคุณต้องใช้พารามิเตอร์ IncludeChildJob.

    ถ้าคุณดูใกล้ ๆ คุณจะเห็นว่างานนั้นล้มเหลวในคอมพิวเตอร์เครื่องเดียวเท่านั้นซึ่งจะนำเราไปสู่ ​​gotcha ครั้งต่อไป เมื่อคุณลองและรับผลลัพธ์สำหรับงานหากคุณระบุชื่องานหรือ ID ของผู้ปกครอง PowerShell จะส่งคืนข้อมูลจากงานลูกทั้งหมด ปัญหาคือว่าหากมีข้อผิดพลาดในงานย่อยอย่างใดอย่างหนึ่งเราจะเหลือข้อความสีแดง.

    มีสองวิธีในการแก้ไขปัญหานี้ ประการแรกหากคุณทราบว่าคอมพิวเตอร์ที่คุณต้องการผลลัพธ์คุณสามารถใช้พารามิเตอร์ ComputerName ของ Recieve -Job cmdlet.

    รับงาน -Id 3 | รับ - งาน - เก็บ - ชื่อคอมพิวเตอร์ไวเปอร์

    หรือคุณสามารถรับผลลัพธ์จากงานย่อยที่ระบุโดยใช้รหัสงานของงานนั้น.

    รับงาน -Id 3 -IncludeChildJob

    รับงาน -Id 5 | รับ - งาน -Keep

    งาน WMI

    งาน WMI นั้นเหมือนกับงานรีโมตมากซึ่งต้องการเพียงเพิ่มพารามิเตอร์ -AsJob ใน Get-WmiObject cmdlet.

    น่าเสียดายที่นี่หมายความว่าพวกเขายังได้รับ gotchas เดียวกันกับที่กล่าวไว้ในส่วนงานระยะไกล.

    งานตามกำหนดเวลา

    งานสามประเภทสุดท้ายที่เราดูนั้นไม่ขัดต่อความหมายว่างานเหล่านั้นมีให้เฉพาะในเซสชันปัจจุบันของคุณ โดยทั่วไปหมายความว่าถ้าคุณเริ่มงานแล้วเปิด PowerShell Console ตัวอื่นแล้วเรียกใช้งานคุณจะไม่เห็นงานใด ๆ อย่างไรก็ตามกลับมาที่คอนโซลที่คุณเริ่มงานคุณจะสามารถดูสถานะได้ นี่คือสิ่งที่ตรงกันข้ามกับงานตามกำหนดการซึ่ง ขัดขืน. โดยทั่วไปงานตามกำหนดเวลาเป็นบล็อกสคริปต์ที่ทำงานตามกำหนดเวลา ในอดีตที่ผ่านมาสามารถทำได้เช่นเดียวกันโดยใช้ Windows Task Scheduler ซึ่งเป็นสิ่งที่เกิดขึ้นภายใต้ประทุน ในการสร้างงานตามกำหนดเวลาใหม่เราทำดังต่อไปนี้:

    ลงทะเบียน-ScheduledJob -Name GetEventLogs -ScriptBlock Get-EventLog -LogName ความปลอดภัย - ใหม่ล่าสุด 100 -Trigger (ใหม่ -Transgerigger -Daily -At 5pm) -ScheduledJobOption (New-ScheduledJobOption -RunElevated)

    มีคำสั่งนั้นเกิดขึ้นค่อนข้างเยอะดังนั้นเรามาทำลายมันกัน.

    • อันดับแรกเราตั้งชื่อ GetEventLogs ให้กับ Job Scheduler.
    • จากนั้นเราบอกว่าเมื่อถูกกระตุ้นเราต้องการให้มันรันเนื้อหาของบล็อกสคริปต์ที่ระบุซึ่งโดยทั่วไปจะได้รับ 100 รายการล่าสุดของบันทึกเหตุการณ์ความปลอดภัย.
    • ต่อไปเราจะระบุทริกเกอร์ เนื่องจากพารามิเตอร์ทริกเกอร์ใช้วัตถุทริกเกอร์เป็นอินพุตเราใช้คำสั่ง parenthetical เพื่อสร้างทริกเกอร์ที่จะปิดทุกวันเวลา 5 โมงเย็น.
    • เนื่องจากเรากำลังจัดการกับบันทึกเหตุการณ์เราจึงต้องเรียกใช้ในฐานะผู้ดูแลระบบซึ่งเราสามารถระบุได้โดยการสร้างวัตถุ ScheduledJobOption ใหม่และส่งต่อไปยังพารามิเตอร์ ScheduledJobOption.

    เนื่องจากนี่เป็นงานประเภทที่แตกต่างกันเล็กน้อยคุณจะต้องใช้คำสั่งที่แตกต่างกันเพื่อดึงรายการของงานที่กำหนดเวลาไว้ทั้งหมดบนเครื่อง.

    Get-ScheduledJob

    นั่นคือทั้งหมดที่มีให้มัน.