Wait-Job

等待到會話中執行的一個或全部 PowerShell 工作都處於終止狀態。

語法

SessionIdParameterSet (預設值)

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

JobParameterSet

Wait-Job
    [-Job] <Job[]>
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [<CommonParameters>]

NameParameterSet

Wait-Job
    [-Name] <String[]>
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [<CommonParameters>]

InstanceIdParameterSet

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

StateParameterSet

Wait-Job
    [-State] <JobState>
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [<CommonParameters>]

FilterParameterSet

Wait-Job
    [-Filter] <Hashtable>
    [-Any]
    [-Timeout <Int32>]
    [-Force]
    [<CommonParameters>]

Description

Wait-Job指令小子會等待工作處於終止狀態後,才繼續執行。 終止狀態如下:

  • 已完成
  • 失敗
  • 已停止
  • 已暫停
  • 已中斷連線

你可以等到指定工作,或所有工作都處於終止狀態。 你也可以用 Timeout 參數設定工作的最大等待時間,或用 Force 參數在 or Disconnected 狀態中等待工作Suspended。

當工作中的指令完成後,會 Wait-Job 回傳一個工作物件並繼續執行。

你可以用 Wait-Job cmdlet 或 AsJob 參數Invoke-Command來等待開始Start-Job的工作。 欲了解更多工作資訊,請參見 about_Jobs。

從 PowerShell 3.0 Windows開始,Wait-Job cmdlet 也會等待自訂工作類型,例如工作流程工作和排程工作實例。 為了讓它能 Wait-Job 等待特定類型的工作,請在執行 Get-Job cmdlet 前,將支援該自訂工作類型的模組匯入會話中,無論是使用 Import-Module cmdlet 或在模組中使用或取得 cmdlet。 關於特定自訂工作類型的資訊,請參閱該自訂工作類型功能的說明文件。

範例

範例一:等待所有工作

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

這個範例展示了如何利用 cmdlet 來 Wait-Job 處理遠端 Start-Job 電腦上啟動的工作。 Start-Job Wait-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 屬性來決定完成了多少工作。

範例三:確定第一個工作何時完成

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

此範例使用 AnyWait-Job 參數來判斷當前會話中第一個工作中第一個處於終止狀態。 它也展示了如何使用 Wait-Job cmdlet 等待遠端工作完成。

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

第二個指令在變數中儲存一個 Get-EventLog 以引號 $c 為標的指令字串。

第三個指令使用 Invoke-Command cmdlet 在 中的$s每個 session 執行Start-Job。 指令啟動Start-Job一個工作,並在變數中$c執行該Get-EventLog指令。

指令使用 Using: scope 修飾符表示變 $c 數是在本地電腦上定義的。 Using: 範圍修飾符是在 PowerShell 3.0 中引入Windows。 如需有關範圍修飾詞的詳細資訊Using:,請參閱about_Remote_Variables。

第四個指令用於 Invoke-Command 在會話中執行指令 Wait-Job 。 它使用 Any 參數等待遠端電腦上的第一個工作達到終止狀態。

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

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

此範例展示了如何使用 的 Wait-JobTimeout 參數來設定遠端電腦上執行的工作的最大等待時間。

第一個指令會在三台遠端電腦(Server01、Server02 和 Server03)各自建立一個 PSSession ,然後將 PSSession 物件儲存在變數中 $s 。

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

第三個指令 在 Invoke-Command 中的每個會話$s中執行Wait-Job。 指令判斷 Wait-Job 所有指令是否在30秒內完成。 它使用值為 30 的 超時 參數來設定最大等待時間,然後將指令結果儲存在變數中 $done 。

在這種情況下,30 秒後,只有 Server02 電腦上的指令完成。 Wait-Job 結束等待,回傳代表已完成工作的物件,並顯示命令提示字元。

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

範例五:等到幾個工作其中一個完成

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

此指令會依據 ID 識別三個工作,並等待其中任一處於終止狀態。 第一個工作完成後,執行會繼續進行。

範例 6:等待一段時間,然後讓工作在背景繼續

Wait-Job -Name "DailyLog" -Timeout 120

此指令會等待 120 秒(兩分鐘)以完成 DailyLog 工作。 如果工作在接下來兩分鐘內沒有完成,執行會繼續,工作也會在背景中繼續執行。

範例7:用名字等待工作

Wait-Job -Name "Job3"

此指令使用工作名稱來識別等待的工作。

範例 8:在以 Start-Job 開頭的本地電腦等待工作

$j = Start-Job -ScriptBlock {Get-ChildItem -Filter *.ps1| Where-Object {$PSItem.LastWriteTime -gt ((Get-Date) - (New-TimeSpan -Days 7))}}
$j | Wait-Job

此範例展示了如何使用 Wait-Job 指令碼,並透過使用 Start-Job。

這些指令會啟動一個工作,取得過去一週新增或更新的 Windows PowerShell 腳本檔案。

第一個指令用於 Start-Job 在本地電腦上啟動一個工作。 這個工作會執行 Get-ChildItem 一個指令,取得過去一週內新增或更新的副檔名檔案 .ps1 。

第三個指令則用 Wait-Job 來等待工作處於終止狀態。 當工作結束後,指令會顯示工作物件,其中包含關於該工作的資訊。

範例 9:透過 Invoke-Command 等待遠端電腦開始的工作

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

此範例展示了如何利用遠端電腦啟動的工作,透過 的 AsJob 參數Invoke-Command來使用 Wait-Job 。 使用 AsJob 時,工作會在本地電腦上建立,結果會自動回傳到本地電腦,儘管該工作是在遠端電腦上執行。

此範例用 Wait-Job 來判斷在三台遠端電腦會話中執行的 Get-Process 指令是否處於終止狀態。

第一個指令會在三台電腦上建立 PSSession 物件,並將其儲存在變數中 $s 。

第二個指令則使用 Invoke-Command 在 中的$s三個會話中執行Get-Process。 指令使用 AsJob 參數,將命令非同步執行為工作。 指令回傳一個工作物件,就像使用 Start-Job, 開始的工作一樣,且工作物件會儲存在變數中 $j 。

第三個指令使用管線運算子(|)將工作物件傳送到 $jWait-Job cmdlet。 此時不需要指令 Invoke-Command ,因為工作存在於本地電腦上。

範例 10:等待有 ID 的工作

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

表示此指令子回傳工作物件,並在任何工作結束時繼續執行。 預設情況下, Wait-Job 會等到所有指定工作都完成後才會顯示提示。

參數屬性

類型:SwitchParameter
預設值:None
支援萬用字元:False
不要顯示:False

參數集

(All)
Position:Named
必要:False
來自管線的值:False
來自管線按屬性名稱的值:False
來自剩餘引數的值:False

-Filter

指定條件雜湊表。 此指令檔會等待滿足雜湊表中所有條件的工作。 輸入一個雜湊表,鍵為工作屬性,值為工作屬性值。

此參數僅適用於自訂工作類型,如工作流程工作與排程工作。 它無法用於標準工作,例如使用 Start-Job 指令長所建立的工作。 關於此參數的支援資訊,請參閱工作類型的說明主題。

此參數是在 Windows PowerShell 3.0 中引進的。

參數屬性

類型:Hashtable
預設值:None
支援萬用字元:False
不要顯示:False

參數集

FilterParameterSet
Position:0
必要:True
來自管線的值:False
來自管線按屬性名稱的值:True
來自剩餘引數的值:False

-Force

表示此指令長程式在暫停或斷線狀態下持續等待工作。 預設情況下, Wait-Job 當工作處於以下任一狀態時,會回傳或結束等待:

  • 已完成
  • 失敗
  • 已停止
  • 已暫停
  • 已中斷連線

此參數是在 Windows PowerShell 3.0 中引進的。

參數屬性

類型:SwitchParameter
預設值:None
支援萬用字元:False
不要顯示:False

參數集

(All)
Position:Named
必要:False
來自管線的值:False
來自管線按屬性名稱的值:False
來自剩餘引數的值:False

-Id

指定一個工作 ID 陣列,該指令本等待這些工作。

ID 是一個整數,唯一識別當前工作階段的工作。 它比實例 ID 更容易記憶和輸入,但它只在當前會話中唯一。 你可以輸入一個或多個ID,並以逗號分隔。 要找到職缺的 ID,請輸入 Get-Job。

參數屬性

類型:

Int32[]

預設值:None
支援萬用字元:False
不要顯示:False

參數集

SessionIdParameterSet
Position:0
必要:True
來自管線的值:False
來自管線按屬性名稱的值:True
來自剩餘引數的值:False

-InstanceId

指定一個工作實例 ID 陣列,該 cmdlet 會等待這些工作。 預設是全部工作。

實例 ID 是一個 GUID,唯一識別電腦上的工作。 要找到作業的實例 ID,請使用 Get-Job。

參數屬性

類型:

Guid[]

預設值:None
支援萬用字元:False
不要顯示:False

參數集

InstanceIdParameterSet
Position:0
必要:True
來自管線的值:False
來自管線按屬性名稱的值:True
來自剩餘引數的值:False

-Job

指定該指令匣等待的工作。 輸入包含工作物件的變數,或輸入取得工作物件的指令。 你也可以用管線運算子把工作物件傳送到 Wait-Job cmdlet。 預設情況下, Wait-Job 會等待目前會話中所有產生的工作。

參數屬性

類型:

Job[]

預設值:None
支援萬用字元:False
不要顯示:False

參數集

JobParameterSet
Position:0
必要:True
來自管線的值:True
來自管線按屬性名稱的值:True
來自剩餘引數的值:False

-Name

指定該指令長等待的親切工作名稱。

參數屬性

類型:

String[]

預設值:None
支援萬用字元:False
不要顯示:False

參數集

NameParameterSet
Position:0
必要:True
來自管線的值:False
來自管線按屬性名稱的值:True
來自剩餘引數的值:False

-State

指定工作狀態。 此指令只等待指定狀態下的任務。 此參數可接受的值為:

  • 尚未開始
  • Running
  • 已完成
  • 失敗
  • 已停止
  • 已封鎖
  • 已暫停
  • 已中斷連線
  • 暫停中
  • 停止中

欲了解更多就業狀態資訊,請參閱 JobState Enumeration。

參數屬性

類型:JobState
預設值:None
接受的值:NotStarted, Running, Completed, Failed, Stopped, Blocked, Suspended, Disconnected, Suspending, Stopping, AtBreakpoint
支援萬用字元:False
不要顯示:False

參數集

StateParameterSet
Position:0
必要:True
來自管線的值:False
來自管線按屬性名稱的值:True
來自剩餘引數的值:False

-Timeout

指定每個工作的最大等待時間,單位為秒。 預設值 -1 表示指令長子會等待工作完成。 時間點是從你提交 Wait-Job 指令開始,而不是指令本身 Start-Job 。

若超過此時間,等待結束並繼續執行,即使工作仍在執行中。 該指令不會顯示任何錯誤訊息。

參數屬性

類型:Int32
預設值:None
支援萬用字元:False
不要顯示:False
別名:TimeoutSec

參數集

(All)
Position:Named
必要:False
來自管線的值:False
來自管線按屬性名稱的值:False
來自剩餘引數的值:False

CommonParameters

此 cmdlet 支援常見參數:-Debug、-ErrorAction、-ErrorVariable、-InformationAction、-InformationVariable、-OutBuffer、-OutVariable、-PipelineVariable、-ProgressAction、-Verbose、-WarningAction 和 -WarningVariable。 如需詳細資訊,請參閱 about_CommonParameters。

輸入

System.Management.Automation.RemotingJob

你可以把工作物件管線到這個 cmdlet。

輸出

System.Management.Automation.PSRemotingJob

此指令檔回傳代表處於終止狀態的工作物件。 若等待結束因逾 時 參數值超過, Wait-Job 則不會回傳任何物件。

備註

PowerShell 包含下列 Wait-Job的別名:

  • 所有平臺:
    • wjb

預設情況下, Wait-Job 當工作處於以下任一狀態時,會回傳或結束等待:

  • 已完成
  • 失敗
  • 已停止
  • 已暫停
  • 已中斷連線

若要指示 Wait-Job 繼續等待暫停和斷線工作,請使用 力 度參數。