共用方式為


Wait-Job

隱藏命令提示字元,直到在工作階段中執行的一項或所有 Windows PowerShell 背景工作完成為止。

語法

Wait-Job [[-InstanceId] <Guid[]>] [-Any] [-Timeout <int>] [<CommonParameters>]

Wait-Job [-Job] <Job[]> [-Any] [-Timeout <int>] [<CommonParameters>]

Wait-Job [[-Name] <string[]>] [-Any] [-Timeout <int>] [<CommonParameters>]

Wait-Job [-Id] <Int32[]> [-Any] [-Timeout <int>] [<CommonParameters>]

Wait-Job [-State {<NotStarted> | <Running> | <Completed> | <Failed> | <Stopped> | <Blocked>}] [-Any] [-Timeout <int>] [<CommonParameters>]

描述

Wait-Job Cmdlet 會等待 Windows PowerShell 背景工作完成後,再顯示命令提示字元。您可以等到任一背景工作完成,或是等到所有背景工作全都完成,並設定工作的等待時間上限。

您可以使用 Wait-Job 取得透過 Start-Job 或透過 Invoke-Command 的 AsJob 參數所啟動的背景工作。

當工作中的命令完成之後,Wait-Job 會顯示命令提示字元,並傳回工作物件,讓您可以經由管道將它輸出至其他命令。

參數

-Any

於任一工作完成時顯示命令提示字元 (並傳回工作物件)。Wait-Job 預設會等到指定的所有工作都完成後,再顯示提示字元。

必要?

false

位置?

named

預設值

接受管線輸入?

false

接受萬用字元?

false

-Id <Int32[]>

等待具有指定之識別碼的工作。

識別碼是整數,可唯一識別目前工作階段內的工作。它比 InstanceId 更容易記得和輸入,但是只有在目前的工作階段中才具有唯一性。您可以輸入一個或多個識別碼 (以逗號分隔)。若要尋找工作的識別碼,請輸入 "Get-Job" 且不要指定參數。

必要?

true

位置?

1

預設值

接受管線輸入?

true (ByPropertyName)

接受萬用字元?

false

-InstanceId <Guid[]>

等待具有指定之執行個體識別碼的工作。預設為所有工作。

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

必要?

false

位置?

1

預設值

接受管線輸入?

true (ByPropertyName)

接受萬用字元?

false

-Job <Job[]>

等待指定的工作。請輸入包含工作物件的變數,或輸入可取得工作物件的命令。您也可以使用管線運算子,將工作物件傳送到 Wait-Job Cmdlet。根據預設,Wait-Job 會等待目前工作階段中建立的所有工作。

必要?

true

位置?

1

預設值

接受管線輸入?

true (ByValue, ByPropertyName)

接受萬用字元?

false

-Name <string[]>

等待具有指定之好記名稱的工作。

必要?

false

位置?

1

預設值

接受管線輸入?

true (ByPropertyName)

接受萬用字元?

false

-State <JobState>

等待具有指定之狀態的工作。有效的值包括 NotStarted、Running、Completed、Stopped、Failed 和 Blocked。

必要?

false

位置?

named

預設值

接受管線輸入?

true (ByPropertyName)

接受萬用字元?

false

-Timeout <int>

決定每一項背景工作的等待時間上限,以秒為單位。預設值為 -1,表示無論執行時間多長,都會等到工作執行完成。在提交 Wait-Job 命令 (而非 Start-Job 命令) 後就會開始計時。

如果超過這個時間,即使工作仍在執行中,還是會結束等候且傳回命令提示字元,並且不會顯示任何錯誤訊息。

必要?

false

位置?

named

預設值

接受管線輸入?

false

接受萬用字元?

false

<CommonParameters>

這個 Cmdlet 支援一般參數:-Verbose、-Debug、-ErrorAction、-ErrorVariable、-OutBuffer 和 -OutVariable。如需詳細資訊,請參閱 about_Commonparameters.

輸入和輸出

輸入型別是可經由管道輸出至 Cmdlet 的物件型別。傳回型別則是 Cmdlet 所傳回的物件型別。

輸入

System.Management.Automation.RemotingJob

您可以經由管道將工作物件輸出至 Wait-Job。

輸出

System.Management.Automation.RemotingJob

Wait-Job 會傳回代表已完成之工作的工作物件。如果等候結束的原因是已超過 Timeout 參數的值,Wait-Job 就不會傳回任何物件。

範例 1

C:\PS>get-job | wait-job

描述
-----------
這個命令會等待工作階段中正在執行的所有背景工作執行完成。





範例 2

C:\PS>$s = new-pssession server01, server02, server03

C:\PS> invoke-command -session $s -scriptblock {start-job -name Date1 -scriptblock {get-date}}

C:\PS> $done = invoke-command -session $s -command {wait-job -name Date1}

C:\PS> $done.count
3

描述
-----------
在這個範例中,會示範如何使用 Wait-Job Cmdlet,處理利用 Start-Job Cmdlet 在遠端電腦啟動的工作。Start-Job 和 Wait-Job 命令都是利用 Invoke-Command Cmdlet 提交到遠端電腦。

範例中使用 Wait-Job 判斷在三台不同電腦上,當做背景工作執行的 Get-Date 命令是否已完成。

第一個命令會分別在三台遠端電腦上建立 Windows PowerShell 工作階段 (PSSession),並將它們儲存在 $s 變數中。

第二個命令會使用 Invoke-Command Cmdlet,在 $s 中的三個工作階段內分別執行 Start-Job 命令。所有的工作都命名為 Date1。

第三個命令會使用 Invoke-Command Cmdlet 執行 Wait-Job 命令,並等待每部電腦的 Date1 工作執行完成,然後將產生的工作物件集合 (陣列) 儲存在 $done 變數中。

第四個命令會使用 $done 變數中工作物件陣列的 Count 屬性判斷已完成的工作數目。





範例 3

C:\PS>$s = new-pssession (get-content machines.txt)  

C:\PS> $c = 'get-eventlog -log system | where {$_.EntryType -eq "error" -and $_.Source -eq "LSASRV"} | out-file errors.txt'

C:\PS> invoke-command -session $s -scriptblock {param($c)start-job -scriptblock {$c}} -ArgumentList $c

C:\PS> 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 中的命令。

因為 $c 變數位於本機電腦上,所以此命令會使用 "param" 關鍵字在命令中宣告區域變數,並使用 ArgumentList 參數提供這些變數的值。

第四個命令會使用 Invoke-Command Cmdlet,在工作階段中執行 Wait-Job 命令。它會使用 Wait-Job Cmdlet 來等候直到遠端電腦上的第一項工作完成為止。





範例 4

C:\PS>$s = new-pssession Server01, Server02, Server03 

C:\PS> $jobs = invoke-command -session $s -scriptblock {start-job -script {get-date}}

C:\PS> $done = invoke-command -session $s -scriptblock {wait-job -timeout 30}

描述
-----------
在這個範例中,會示範如何使用 Wait-Job 的 Timeout 參數,設定在遠端電腦執行之工作的等待時間上限。

第一個命令會分別在三台遠端電腦 (Server01、Server02 和 Server03) 上建立 PSSession,並將這些 PSSession 儲存在 $s 變數中。

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

第三個命令會使用 Invoke-Command Cmdlet,在 $s 中的每個 PSSessions 內執行 Wait-Job 命令。Wait-Job 命令會判斷所有的命令是否都已在 30 秒內執行完成。它會使用值為 30 (秒) 的 Timeout 參數來建立等待時間上限,並將命令的結果儲存在 $done 變數中。

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

$done 變數包含表示在 Server02 執行之工作的工作物件。





範例 5

C:\PS>wait-job -id 1,2,5 -any

描述
-----------
這個命令會依識別碼來識別三項工作,並等到其中任一工作執行完成。當第一項工作完成時,命令提示字元就會傳回。





範例 6

C:\PS>wait-job -name DailyLog -timeout 120

描述
-----------
這個命令會等待 120 秒 (兩分鐘),讓 DailyLog 工作完成。如果工作未能在接下來的兩分鐘內完成,命令提示字元還是會傳回,而且工作也會繼續在背景執行。





範例 7

C:\PS>wait-job -name Job3

描述
-----------
此 Wait-Job 命令會使用工作名稱識別要等待的工作名稱。





範例 8

C:\PS>C:\PS> $j = start-job -script {get-childitem *.ps1| where {$_lastwritetime -gt ((get-date) - (new-timespan -days 7))}}

C:\PS> $j | wait-job

描述
-----------
在這個範例中,會示範如何使用 Wait-Job Cmdlet,處理利用 Start-Job Cmdlet 在本機電腦啟動的工作。

這些命令會啟動一項工作,取得前一週新增或更新的 Windows PowerShell 指令碼檔案。

第一個命令會使用 Start-Job Cmdlet,在本機電腦啟動背景工作。該工作會執行 Get-ChildItem 命令,以取得前一週新增或更新,而且副檔名為 ".ps1" 的所有檔案。

第三個命令會使用 Wait-Job Cmdlet 等到工作執行完成。當工作完成時,此命令會顯示包含工作相關資訊的工作物件。





範例 9

C:\PS>$s = new-pssession Server01, Server02, Server03

C:\PS> $j = invoke-command -session $s -scriptblock {get-process} -asjob

C:\PS> $j | wait-job

描述
-----------
在這個範例中,會示範如何使用 Wait-Job Cmdlet 處理利用 Invoke-Command Cmdlet 的 AsJob 參數在遠端電腦啟動的工作。使用 AsJob 時,即使工作是在遠端電腦執行,但仍是在本機電腦建立工作,而且結果也會自動傳回到本機電腦。

範例中使用 Wait-Job 判斷在三部遠端電腦之執行階段中執行的 Get-Process 命令是否已完成。

第一個命令會在三台電腦上建立 PSSession,並將它們儲存在 $s 變數中。

第二個命令會使用 Invoke-Command Cmdlet,在 $s 中的三個 PSSession 內分別執行 Get-Process 命令。這個命令會使用 AsJob 參數,將命令當做背景工作以非同步方式執行。與使用 Start-Job 啟動的工作一樣,這個命令會傳回工作物件,而且會將工作物件儲存在 $j 變數中。

第三個命令會使用管線運算子 (|),將 $j 中的工作物件傳送到 Wait-Job Cmdlet。請注意,此範例不需要 Invoke-Command 命令,因為工作是位於本機電腦。





範例 10

C:\PS>get-job

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

C:\PS> wait-job -id 1

描述
-----------
這個命令會等待 ID 值為 1 的工作。





請參閱

概念

about_Jobs
about_Job_Details
about_remote_jobs
Start-Job
Get-Job
Receive-Job
Stop-Job
Remove-Job
Invoke-Command