โรงเรียน 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
นั่นคือทั้งหมดที่มีให้มัน.