รอคำสั่งให้เสร็จสิ้นใน PowerShell [6 วิธี]
ใช้ Start-Process Cmdlet
ใช้ Start-Process พร้อมด้วยพารามิเตอร์ -Wait เพื่อรอให้คำสั่งเสร็จสิ้น
ใช้ Start-Process กับ -Wait พารามิเตอร์:
Start-Process explorer -Waitเอาท์พุท :
ในผลลัพธ์ข้างต้น เราจะเห็นว่าคำสั่งรอจนกระทั่ง file explorer เปิดขึ้นมา ในการทำเช่นนั้น เราใช้ Start-Process พร้อมด้วยพารามิเตอร์ -Wait Start-Process cmdlet ใช้เพื่อเริ่มกระบวนการหนึ่งหรือหลายกระบวนการบนเครื่องท้องถิ่น ตามค่าเริ่มต้น ระบบจะสร้างกระบวนการใหม่ ซึ่งจะสืบทอดตัวแปรสภาพแวดล้อมทุกตัวที่กำหนดไว้ในกระบวนการปัจจุบัน
ต่อไป เราระบุชื่อกระบวนการที่นำหน้าด้วย cmdlet Start-Process เราสามารถระบุสคริปต์ ไฟล์ปฏิบัติการ หรือไฟล์ที่จะเปิดโดยใช้โปรแกรมบนเครื่องคอมพิวเตอร์ของเราได้ โปรดจำไว้ว่า หากเราพูดถึงไฟล์ที่ไม่สามารถเรียกใช้งานได้ ดังนั้น Start-Process cmdlet จะเริ่มโปรแกรมที่เกี่ยวข้องกับไฟล์ที่กำหนด
Start-Process ช่วยให้เราใช้ตัวเลือกและพารามิเตอร์ต่างๆ หนึ่งในนั้นคือพารามิเตอร์ -Wait ซึ่งหมายความว่า cmdlet นี้จะรอให้กระบวนการดังกล่าว รวมถึงกระบวนการที่สืบทอดมาเสร็จสิ้นก่อนจึงจะได้รับอินพุตเพิ่มเติม พารามิเตอร์นี้จะเก็บหน้าต่างไว้หรือระงับพรอมต์คำสั่งจนกว่ากระบวนการที่ระบุจะเสร็จสิ้น
นอกจากนี้เรายังสามารถตั้งเวลาให้รอก่อนที่จะดำเนินการตามคำสั่งต่อไปนี้ นี่คือจุดที่คำสั่ง Timeout เข้ามาในรูปภาพ ดูตัวอย่างต่อไปนี้เพื่อเรียนรู้วิธีใช้ cmdlet Start-Process ด้วยคำสั่ง Timeout
ใช้ Start-Process ด้วยคำสั่ง Timeout เพื่อรอกรอบเวลาที่กำหนดสิ้นสุดก่อนดำเนินการคำสั่งถัดไป
ใช้ Start-Process กับคำสั่งหมดเวลา:
Start-Process explorer; Timeout 5; Write-Host "The explorer process has been started"เอาท์พุท :
ที่นี่ เราเริ่มต้นกระบวนการและรัน cmdlet Write-Host หลังจากรอ 5 วินาที คุณสามารถดูการนับถอยหลังทางด้านซ้ายของคอนโซล PowerShell สำหรับตัวอย่างโค้ดข้างต้น จำเป็นต้องเข้าใจขั้นตอนการดำเนินการ ขั้นแรก กระบวนการเริ่มต้นโดยใช้ cmdlet Start-Process cmdlet นี้คืออะไร และทำไมเราจึงใช้มัน เราได้เรียนรู้สิ่งนี้แล้วโดยใช้พารามิเตอร์ -Wait ด้านบน
ประการที่สอง คำสั่ง Timeout ถูกดำเนินการเพื่อรอตามจำนวนวินาทีที่กำหนด เมื่อหมดเวลาแล้ว Write-Host cmdlet จะถูกดำเนินการ ซึ่งแสดงข้อความบนคอนโซล PowerShell สุดท้าย Write-Host cmdlet ถูกใช้เพื่อเขียนเอาต์พุต/ข้อความที่กำหนดเองไปยังโฮสต์ ในที่นี้ โฮสต์หมายถึงคอนโซล PowerShell
หากคุณใช้ Windows PowerShell เวอร์ชัน 5.0 หรือสูงกว่า คุณต้องทราบว่า
Write-Hostเป็น wrapper สำหรับWrite-Informationแล้วข้อดีของมันคืออะไรล่ะ? ซึ่งช่วยให้เราใช้Write-Hostเพื่อส่งผลลัพธ์ไปยังสตรีมข้อมูล ซึ่งเปิดใช้งานsuppressionหรือcaptureของข้อมูลที่เขียนโดยใช้Write-Hostcmdlet ในขณะที่ยังคงรักษาความเข้ากันได้แบบย้อนหลัง
ใช้ Start-Sleep Cmdlet
ใช้ cmdlet Start-Sleep พร้อมด้วยพารามิเตอร์ -Seconds เพื่อรอกรอบเวลาที่กำหนดก่อนที่เราจะดำเนินการคำสั่งต่อไปนี้ใน PowerShell ต่อไป
ใช้ Start-Sleep Cmdlet:
Start-Sleep -Seconds 10; Write-Host "10 seconds have been passed."เอาท์พุท :
ดังที่คุณเห็นในผลลัพธ์ข้างต้น เราต้องรอ 10 วินาทีจึงจะเสร็จสิ้นก่อนที่จะดำเนินการ cmdlet Write-Host เราได้กล่าวถึง Write-Host ในส่วนก่อนหน้าแล้ว มาดำเนินการต่อด้วย Start-Sleep cmdlet cmdlet นี้ใช้เพื่อระงับเซสชันหรือกิจกรรมในช่วงเวลาที่กำหนด เราสามารถใช้งานได้ตามความต้องการของเรา เช่น ใช้เพื่อรอการดำเนินการเฉพาะให้เสร็จสิ้นหรือก่อนดำเนินการซ้ำ
-Seconds ใช้เพื่อระบุระยะเวลาที่ทรัพยากรต้องเข้าสู่โหมดสลีป (เป็นวินาที) เราสามารถละชื่อพารามิเตอร์นี้หรือทำให้สั้นลงแล้วใช้ -s โปรดทราบว่าเราสามารถระบุค่าเศษส่วนได้โดยใช้ PowerShell เวอร์ชัน 6.2.0 หรือสูงกว่า
ใช้ Wait-Job Cmdlet
หากต้องการรอให้งานเบื้องหลังสิ้นสุด:
- ใช้
Start-Jobเพื่อสร้างและเรียกใช้งานพื้นหลัง - ใช้ cmdlet
Wait-Jobเพื่อรอให้งานพื้นหลังเสร็จสิ้น - เมื่องานพื้นหลังเสร็จสิ้น ให้ใช้
Write-Hostเพื่อพิมพ์ข้อความที่กำหนดเองบนคอนโซล
ใช้ Wait-Job Cmdlet:
$startJob = Start-Job -ScriptBlock{
$i = 0
while($i -lt 10){
$i++
Sleep 3
}
}
Wait-Job $startJob.Name
Write-Output "This particular command is executed after completing the job."เอาท์พุท :
ในสคริปต์ด้านบน เราใช้ Start-Job เพื่อสร้างและรันงานพื้นหลัง สิ่งนี้ทำให้เกิดสองประเด็น: ประการแรก อะไรคืองานเบื้องหลัง และประการที่สอง มีคำสั่งใดบ้างที่รวมอยู่ในการทำงานนี้ให้สำเร็จ งานเบื้องหลังหมายถึงคำสั่งหรือชุดคำสั่งที่ทำงานในกระบวนการแยกต่างหากในเครื่องของเรา บล็อกสคริปต์ที่แสดงด้วยเครื่องหมายปีกกา ({}) ประกอบด้วยคำสั่งทั้งหมดที่จะถูกดำเนินการโดยเป็นส่วนหนึ่งของงานพื้นหลังนี้
ในกรณีของเรา เราใช้ลูป While ซึ่งเริ่มวนซ้ำจาก 0 (รวมถึง) ถึง 10 (ไม่รวม) หากต้องการทำซ้ำ เราตั้งค่าตัวแปรตัวนับชื่อ $i เป็น 0 และเพิ่มทีละ 1 ในการวนซ้ำแต่ละครั้ง โปรดทราบว่าเราจะรอ 3 วินาทีก่อนที่จะย้ายไปยังการวนซ้ำครั้งถัดไป
ต่อไป เราใช้ Wait-Job cmdlet เพื่อรอให้งานพื้นหลังเสร็จสิ้น ในที่นี้ $startJob.Name มีชื่อของงานพื้นหลังที่สร้างโดย cmdlet Start-Job; ชื่อนี้ถูกส่งผ่าน (เป็นอาร์กิวเมนต์) ไปยัง cmdlet Wait-Job เพื่อรอให้งานนี้เสร็จสมบูรณ์
สุดท้าย เราใช้ Write-Output cmdlet เพื่อพิมพ์ข้อความสตริงบนคอนโซล และเพื่อแสดงให้เห็นว่าคำสั่งนี้จะถูกดำเนินการหลังจากทำงานเบื้องหลังเสร็จสิ้นเท่านั้น ดูผลลัพธ์ด้านบนเพื่อความเข้าใจที่ดีขึ้น
ใช้ Wait-Process Cmdlet
ใช้ Wait-Process cmdlet เพื่อรอให้คำสั่งเสร็จสิ้นใน PowerShell
ใช้ Cmdlet กระบวนการรอ:
Notepad.exe | Wait-Processเอาท์พุท :
ที่นี่ เราใช้ Wait-Process cmdlet เพื่อรอให้กระบวนการ/กระบวนการสิ้นสุด สำหรับตัวอย่างข้างต้น จะรอให้ NotePad ปิดก่อนที่จะยอมรับอินพุตเพิ่มเติมหรือย้ายไปยังคำสั่งต่อไปนี้ในไปป์ไลน์ cmdlet นี้ระงับพรอมต์คำสั่งจนกว่ากระบวนการจะเสร็จสิ้น/หยุดลง นอกจากนี้เรายังสามารถพูดถึงกระบวนการโดยใช้ ID กระบวนการ (หรือที่เรียกว่า PID) ชื่อกระบวนการหรือไพพ์ไปที่ Wait-Process cmdlet โปรดทราบว่าเราสามารถใช้ cmdlet นี้สำหรับกระบวนการที่ทำงานในเครื่องของเรา
Wait-Processcmdlet จะไม่ทำงานบน macOS และ Linux
การใช้คลาส Diagnostics.Process
ใช้คลาส Diagnostics.Process เพื่อรอให้คำสั่ง/กระบวนการเสร็จสิ้นใน PowerShell
ใช้ Diagnostics.Process Class:
[Diagnostics.Process]::Start('notepad.exe').WaitForExit()เอาท์พุท :
การทำงานของคลาส Diagnostics.Process นั้นเหมือนกับ cmdlet Wait-Process ที่เราได้เรียนรู้ในส่วนที่แล้ว เราต้องการมากกว่านี้หากเราติดตั้งไลบรารี .NET ไว้ในเครื่องของเรา อย่างไรก็ตาม ไม่แนะนำให้ดิ้นรนกับโซลูชันที่ท้าทายเมื่อเรามีคำสั่ง PowerShell ที่ง่ายและสะดวกอยู่แล้ว เกี่ยวกับวิธีแก้ปัญหาข้างต้น เมธอด Start() เริ่มต้นกระบวนการที่กำหนดซึ่งเราส่งผ่านเป็นอาร์กิวเมนต์ ในขณะที่ WaitForExit() รอให้กระบวนการนี้สิ้นสุด
ใช้ Out-Null Cmdlet
ใช้ Out-Null cmdlet เพื่อรอให้คำสั่ง/กระบวนการเสร็จสิ้นใน PowerShell
ใช้ Out-Null Cmdlet:
Notepad.exe | Out-Nullเอาท์พุท :
การใช้ Out-Null เป็นอีกวิธีหนึ่งในการรอให้กระบวนการที่ระบุสิ้นสุด/ออก การปิ๊งด้วย Out-Null cmdlet หมายความว่าเรากำลังทำเครื่องหมาย Windows PowerShell ให้เรียกใช้กระบวนการพื้นฐานที่ด้านบนของแอปพลิเคชันที่กำลังทำงานอยู่ cmdlet นี้ไม่แสดงอะไรเลยนอกจากรอให้คำสั่ง/กระบวนการดำเนินการให้เสร็จสิ้น โปรดจำไว้ว่า Out-Null จะรอให้คำสั่งทั้งหมดดำเนินการ







