共用方式為


Wait-Job

隱藏命令提示字元,直到會話中執行的一或所有 PowerShell 背景工作都完成為止。

Syntax

Wait-Job
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [-Id] <Int32[]>
    [<CommonParameters>]
Wait-Job
    [-Job] <Job[]>
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [<CommonParameters>]
Wait-Job
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [-Name] <String[]>
    [<CommonParameters>]
Wait-Job
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [-InstanceId] <Guid[]>
    [<CommonParameters>]
Wait-Job
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [-State] <JobState>
    [<CommonParameters>]
Wait-Job
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [-Filter] <Hashtable>
    [<CommonParameters>]

Description

Cmdlet Wait-Job 會先等候 PowerShell 背景工作完成,再顯示命令提示字元。 您可以等到任一背景工作完成,或等到所有背景工作都完成,而且可以設定工作的最長等待時間。

當作業中的命令完成時, Wait-Job 會顯示命令提示字元並傳回作業物件,以便您將它傳送至另一個命令。

您可以使用 Wait-Job Cmdlet 等候背景工作,例如使用 Start-Job Cmdlet 或 Cmdlet 的 AsJob 參數啟動的 Invoke-Command 作業。 如需 Windows PowerShell 背景工作的詳細資訊,請參閱 about_Jobs

從 Windows PowerShell 3.0 開始,Wait-JobCmdlet 也會等候自定義作業類型,例如工作流程作業和排程工作的實例。 若要啟用 Wait-Job 以等候特定類型的作業,請在執行 Get-Job Cmdlet 之前,先將支援自定義作業類型的模組匯入會話,方法是使用 Import-Module Cmdlet 或使用 或取得模組中的 Cmdlet。 如需有關特定自訂工作類型的資訊,請參閱自訂工作類型功能的文件。

範例

範例 1:等候所有作業

Get-Job | Wait-Job

此命令會等候會話中執行的所有背景工作完成。

範例 2:使用 Start-Job 等候遠端電腦上啟動的工作

$s = New-PSSession Server01, Server02, Server03
Invoke-Command -Session $s -ScriptBlock {Start-Job -Name Date1 -ScriptBlock {Get-Date}}
$done = Invoke-Command -Session $s -Command {Wait-Job -Name Date1}
$done.Count

3

此範例示範如何使用 Wait-Job Cmdlet 搭配使用 Cmdlet 在遠端電腦上 Start-Job 啟動的工作。 和 Wait-Job 命令都會Start-Job使用 Invoke-Command Cmdlet 提交至遠端電腦。

此範例會使用 Wait-Job 來判斷是否 Get-Date 已完成在三部不同計算機上以背景工作身分執行的命令。

第一個命令會在三部遠端計算機上建立 Windows PowerShell 工作階段 (PSSession) ,並將其儲存在變數中$s

第二個命令會使用 Invoke-Command 在中的三個會話$s中執行Start-Job。 所有的工作都命名為 Date1。

第三個命令會使用 Invoke-Command 來執行 Wait-Job。 此命令會等候每部電腦上的 Date1 作業完成。 它會將產生的集合 (陣列) 的作業物件儲存在變數中 $done

第四個命令會使用 變數中$done作業物件陣列的 Count 屬性,來判斷完成多少個作業。

範例 3:判斷第一個背景工作何時完成

$s = New-PSSession (Get-Content Machines.txt)
$c = 'Get-EventLog -LogName System | where {$_.EntryType -eq "error" --and $_.Source -eq "LSASRV"} | Out-File Errors.txt'
Invoke-Command -Session $s -ScriptBlock {Start-Job -ScriptBlock {$Using:c}
Invoke-Command -Session $s -ScriptBlock {Wait-Job -Any}

這個範例會使用 Wait-Job Any 參數來判斷目前會話中執行之許多背景作業的第一個何時完成。 它也會示範如何使用 Wait-Job Cmdlet 等待遠端作業完成。

第一個命令會在 Machines.txt 檔案中列出的每部計算機上建立 PSSession ,並將 PSSession 物件儲存在 變數中 $s 。 命令會 Get-Content 使用 Cmdlet 來取得檔案的內容。 命令 Get-Content 會以括弧括住,以確保它在命令之前 New-PSSession 執行。

第二個 Get-EventLog 命令會將命令字串以引號儲存在變數中 $c

第三個命令會使用 Invoke-Command Cmdlet 在 中的每個會話中$s執行Start-Job。 命令會Start-Job啟動在變數中$c執行Get-EventLog命令的背景作業。

命令會使用 Using 範圍修飾詞來指出 $c 變數已在本機電腦上定義。 Using 範圍修飾符是在 Windows PowerShell 3.0 中引進。 如需 Using scope 修飾詞的詳細資訊,請參閱 about_Remote_Variables

第四個Wait-Job命令會使用 Invoke-Command 在會話中執行命令。 它會使用 Any 參數等候遠端電腦上的第一個作業完成。

範例 4:設定遠端電腦上的作業等候時間

$s = New-PSSession Server01, Server02, Server03
$jobs = Invoke-Command -Session $s -ScriptBlock {Start-Job -ScriptBlock {Get-Date}}
$done = Invoke-Command -Session $s -ScriptBlock {Wait-Job -Timeout 30}

此範例示範如何使用的 Wait-JobTimeout 參數,為遠端電腦上執行的作業設定等候時間上限。

第一個命令會在三部遠端計算機上建立 PSSession , (Server01、Server02 和 Server03) ,然後將 PSSession 物件儲存在 變數中 $s

第二個命令會使用 Invoke-Command 在中的每個 PSSession 物件中$s執行Start-Job。 它會將產生的作業物件儲存在變數中 $jobs

第三個命令會使用 Invoke-Command 在中的每個會話中$s執行Wait-Job。 此命令 Wait-Job 會判斷所有命令是否在 30 秒內完成。 它會使用 Timeout 參數的值 30 來建立等候時間上限,然後將命令的結果儲存在 變數中 $done

在本例中,30 秒之後,只有 Server02 電腦上的命令已完成。 Wait-Job 會結束等候、顯示命令提示字元,並傳回代表已完成之作業的物件。

$done變數包含一個作業物件,代表在 Server02 上執行的作業。

範例 5:等候數個作業的其中一個完成

Wait-Job -id 1,2,5 -Any

此命令會依標識碼識別三個作業,並等到其中任一個工作完成為止。 當第一個作業完成時,命令提示字元會傳回 。

範例 6:等候一段時間,然後允許作業在背景繼續

Wait-Job -Name "DailyLog" -Timeout 120

此命令會等候 120 秒 (兩分鐘,) DailyLog 作業完成。 如果作業在接下來的兩分鐘內未完成,命令提示字元仍會傳回,而且作業會繼續在背景中執行。

範例 7:依名稱等候作業

Wait-Job -Name "Job3"

此命令會使用作業名稱來識別要等候的作業。

範例 8:等候本機電腦上的作業以 Start-Job

$j = Start-Job -ScriptBlock {Get-ChildItem *.ps1| where {$_lastwritetime -gt ((Get-Date) - (New-TimeSpan -Days 7))}}
$j | Wait-Job

此範例示範如何使用 Wait-Job Cmdlet 搭配使用 在本機電腦上 Start-Job啟動的工作。

這些命令啟動可取得上週新增或更新之 Windows PowerShell 指令檔的工作。

第一個命令會使用 Start-Job 在本機計算機上啟動背景工作。 此作業會執行命令 Get-ChildItem ,以取得在上周新增或更新 .ps1 擴展名的所有檔案。

第三個命令會使用 Wait-Job 來等候作業完成。 當作業完成時,命令會顯示作業物件,其中包含作業的相關信息。

範例 9:使用 Invoke-Command 等候遠端電腦上啟動的工作

$s = New-PSSession Server01, Server02, Server03
$j = Invoke-Command -Session $s -ScriptBlock {Get-Process} -AsJob
$j | Wait-Job

此範例示範如何使用 Wait-JobAsJob 參數搭配遠端電腦上啟動的工作 Invoke-Command。 使用 AsJob 時,作業會在本機電腦上建立,而且結果會自動傳回至本機電腦,即使作業是在遠端電腦上執行也一樣。

這個範例會使用 Wait-Job 來判斷是否 Get-Process 已完成在三部遠端電腦上的會話中執行的命令。

第一個命令會在三部計算機上建立 PSSession 物件,並將其儲存在變數中 $s

第二個命令會使用 Invoke-Command 在中的三個會話$s中執行Get-Process。 此命令會使用 AsJob 參數,以異步方式以背景工作的形式執行命令。 此命令會傳回作業物件,就像使用 Start-Job啟動的作業一樣,作業物件會儲存在變數中 $j

第三個命令會使用管線運算子 (|) 將作業物件 $j 傳送至 Wait-Job Cmdlet。 Invoke-Command在此情況下不需要命令,因為作業位於本機計算機上。

範例 10:等候標識碼為的工作

Get-Job

Id   Name     State      HasMoreData     Location             Command
--   ----     -----      -----------     --------             -------
1    Job1     Completed  True            localhost,Server01.. get-service
4    Job4     Completed  True            localhost            dir | where

Wait-Job -Id 1

此命令等待 ID 值為 1 的工作。

參數

-Any

表示此 Cmdlet 會顯示命令提示字元,並在任何作業完成時傳回作業物件。 根據預設,在顯示提示之前, Wait-Job 等候所有指定的作業完成。

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Filter

指定條件的雜湊表。 此 Cmdlet 會等候滿足哈希表中所有條件的作業。 輸入索引鍵為工作屬性且值為工作屬性值的雜湊表。

這個參數只適用於自訂工作類型,例如,工作流程工作和已排程的工作。 它不適用於標準背景工作,例如使用 Cmdlet 建立的 Start-Job 作業。 如需支援此參數的詳細資訊,請參閱工作類型的說明主題。

此參數是在 Windows PowerShell 3.0 引進。

Type:Hashtable
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-Force

表示此 Cmdlet 會繼續等候處於 [已暫停] 或 [已中斷連線] 狀態的作業。 當作業處於下列其中一種狀態時,預設 Wait-Job 會傳回或結束等候:

  • Completed
  • 失敗
  • 已停止
  • 暫止
  • 已中斷連接

此參數是在 Windows PowerShell 3.0 引進。

Type:SwitchParameter
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Id

指定此 Cmdlet 等候之作業的標識子陣列。

識別碼是一個整數,可唯一識別目前工作階段中的工作。 與執行個體識別碼相比,它比較容易記住並輸入,但是它只有在目前的工作階段內是唯一的。 您可以輸入一個或多個識別碼,以逗號分隔。 若要尋找工作的識別碼,請輸入 Get-Job

Type:Int32[]
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-InstanceId

指定此 Cmdlet 等候之作業實例識別碼的陣列。 預設為所有工作。

執行個體識別碼是 GUID,可唯一識別電腦上的工作。 若要尋找作業的實體識別碼,請使用 Get-Job

Type:Guid[]
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-Job

指定此 Cmdlet 等候的作業。 輸入包含工作物件的變數,或輸入可取得工作物件的命令。 您也可以使用管線運算符,將作業物件傳送至 Wait-Job Cmdlet。 根據預設, Wait-Job 會等候在目前會話中建立的所有作業。

Type:Job[]
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-Name

指定這個 Cmdlet 等候之工作的易記名稱。

Type:String[]
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-State

指定工作狀態。 此 Cmdlet 只會等候處於指定狀態的作業。 此參數可接受的值為:

  • NotStarted
  • 執行中
  • Completed
  • 失敗
  • 已停止
  • 封鎖
  • 暫止
  • 已中斷連接
  • Suspending
  • 停止中

如需作業狀態的詳細資訊,請參閱 JobState 列舉

Type:JobState
Accepted values:NotStarted, Running, Completed, Failed, Stopped, Blocked, Suspended, Disconnected, Suspending, Stopping, AtBreakpoint
Position:0
Default value:None
Required:True
Accept pipeline input:True
Accept wildcard characters:False

-Timeout

指定每個背景作業的等候時間上限,以秒為單位。 默認值 -1 表示 Cmdlet 會等到作業完成為止。 當您提交 Wait-Job 命令,而不是 Start-Job 命令時,就會開始計時。

如果超過這個時間,即使工作仍在執行,也會結束等待並返回命令提示字元。 此命令不會顯示任何錯誤訊息。

Type:Int32
Aliases:TimeoutSec
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

輸入

System.Management.Automation.RemotingJob

您可以使用管線將工作物件傳送至此 Cmdlet。

輸出

System.Management.Automation.PSRemotingJob

此 Cmdlet 會傳回代表已完成工作的作業物件。 如果等候結束,因為超過 Timeout 參數的值, Wait-Job 則不會傳回任何物件。

備註

當作業處於下列其中一種狀態時,預設 Wait-Job 會傳回或結束等候:

  • Completed
  • 失敗
  • 已停止
  • 暫止
  • 已中斷連線 若要繼續 Wait-Job 等候 Suspended 和 Disconnected 作業,請使用 Force 參數。