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