在 PowerShell 中等待每個命令完成

Marion Paul Kenneth Mendoza 2023年1月30日 2022年5月16日
  1. 在 PowerShell 中使用 Out 命令等待每個命令完成
  2. 在 PowerShell 中使用 Start-Process Cmdlet 等待每個命令完成
  3. 在 PowerShell 中使用後臺作業等待每個命令完成
  4. 在 PowerShell 中使用 Wait-Process Cmdlet 等待每個命令完成
  5. 在 PowerShell 中使用 [Diagnostics.Process] 類等待每個命令完成
在 PowerShell 中等待每個命令完成

通常,Windows PowerShell 在啟動以下命令之前會等待內部命令。

此規則的一個例外是基於外部 Windows 子系統的 EXE。此外,Windows PowerShell 在執行可執行程式時不會等待命令完成。

本文將向你展示如何強制 Windows PowerShell 環境等待帶有可執行檔案的命令完成,然後再轉到以下命令。

在 PowerShell 中使用 Out 命令等待每個命令完成

如前所述,執行可執行檔案不會等待命令完成,而是直接轉到以下命令。我們可能需要避免這種情況,特別是如果我們建立一個應該順序執行應用程式的指令碼。

一個絕妙的技巧是使用 Out 命令之一,例如 Out-Null。執行應用程式時,通過管道傳送 Out-Null cmdlet 將誘使 Windows PowerShell 在正在執行的應用程式之上執行底層 cmdlet。

請記住,cmdlet Out-Null 不會在控制檯中顯示任何內容,因此它看起來像是一個標準執行的應用程式。唯一的區別是它等待整個命令列執行。

示例程式碼:

Notepad.exe | Out-Null

我們可以使用的其他 Out 命令示例如下:

  • Out-Default - 將輸出傳送到預設格式環境和預設輸出 cmdlet。
  • Out-File - 將輸出傳送到檔案。
  • Out-GridView - 將輸出傳送到單獨視窗中的互動式表格。
  • Out-Host - 將輸出傳送到命令列。
  • Out-Printer - 將輸出傳送到印表機。
  • Out-String - 將物件作為一系列字串傳送到主機。

在 PowerShell 中使用 Start-Process Cmdlet 等待每個命令完成

使 Windows PowerShell 等待命令列完成的另一種方法是 Start-Process cmdlet。

例如,我們可以使用 Start-Process cmdlet 的 -Wait 引數,Windows PowerShell 將等待程序完成,然後再執行以下命令列。

Start-Process notepad.exe -NoNewWindow -Wait
注意
上例中的 -NoNewWindow 引數將啟動當前程序而不開啟新的控制檯視窗。

使用 PowerShell 社群擴充套件版本,首先建立一個新物件。一旦建立了物件,就會呼叫 WaitForExit() 函式。

$proc = Start-Process notepad.exe -NoNewWindow -PassThru
$proc.WaitForExit()

在 PowerShell 中使用後臺作業等待每個命令完成

使 Windows PowerShell 等待命令列完成的另一種方法是使用後臺作業。

後臺作業是在本地機器的單獨程序中執行的一個命令或一組命令。後臺作業的示例語法如下所示。

$job = Start-Job { notepad.exe }
Wait-Job $job
Receive-Job $job

呼叫 Wait-Job cmdlet 將使程序等待,直到在命令列中呼叫 Receive-Job

在 PowerShell 中使用 Wait-Process Cmdlet 等待每個命令完成

使 Windows PowerShell 等待命令列完成的另一種方法是 Wait-Process cmdlet。

就像我們的第一個示例一樣,我們可以將其通過管道傳輸到我們的可執行檔案中並等待命令列完成。但是,使用此 cmdlet 僅適用於 Windows PowerShell 版本 5.1 及更低版本,不適用於最新的 PowerShell (Core) 7。

Notepad.exe | Wait-Process

在 PowerShell 中使用 [Diagnostics.Process] 類等待每個命令完成

如果你的系統中安裝了 .NET 庫,你可以使用 [Diagnostics.Process] 類等待程序完成,然後再轉到以下命令列。

但是,我們不建議使用它,因為 Windows PowerShell 中提供了其他更簡單的 cmdlet,我們可以充分利用它們。如果 PowerShell 命令不可用,請僅使用 .NET 庫。

[Diagnostics.Process]::Start('notepad.exe').WaitForExit()
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn