ค้นหาเว็บไซต์

รอคำสั่งให้เสร็จสิ้นใน 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-Host cmdlet ในขณะที่ยังคงรักษาความเข้ากันได้แบบย้อนหลัง

ใช้ 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-Process cmdlet จะไม่ทำงานบน 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 จะรอให้คำสั่งทั้งหมดดำเนินการ

บทความที่เกี่ยวข้อง