Share via


Wait-Job

セッションで実行されているWindows PowerShellバックグラウンド ジョブの 1 つまたはすべてを完了するまで、コマンド プロンプトを抑制します。

構文

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>]

説明

Wait-Job コマンドレットは、Windows PowerShellバックグラウンド ジョブが完了するまで待機してから、コマンド プロンプトを表示します。 任意のバックグラウンド ジョブまたはすべてのバックグラウンド ジョブが完了まで待機できます。さらに、ジョブの最大待機時間を設定できます。

ジョブ内のコマンドが完了すると、Wait-Job はコマンド プロンプトを表示し、ジョブ オブジェクトを返します。そのため、パイプを使用して別のコマンドにジョブ オブジェクトを渡すことができます。

Wait-Job コマンドレットを使用すると、バックグラウンド ジョブ (Start-Job コマンドレットまたは Invoke-Command コマンドレットの AsJob パラメーターを使用して開始されたものなど) を待機できます。 Windows PowerShell のバックグラウンド ジョブの詳細については、「about_Jobs」を参照してください。

Windows PowerShell 3.0 以降、Wait-Job コマンドレットは、ワークフロー ジョブやスケジュールされたジョブのインスタンスなどのカスタム ジョブの種類を待機します。 Wait-Job が特定の種類のジョブを待機できるようにするには、カスタム ジョブの種類をサポートするモジュールをセッションにインポートしてから、Get-Job コマンドレットを実行します。そのためには、Import-Module コマンドレットを使用するか、モジュールで コマンドレットを使用または取得します。 特定のカスタム ジョブの種類については、カスタムのジョブの種類機能のドキュメントを参照してください。

例 1: すべてのジョブを待機する

PS C:\> Get-Job | Wait-Job

このコマンドは、セッションで実行されているすべてのバックグラウンド ジョブが完了するまで待機します。

例 2: Start-Job を使用してリモート コンピューターで開始されたジョブを待機する

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

この例では、 Start-Job コマンドレットを使用して、リモート コンピューターで開始されたジョブで Wait-Job コマンドレットを使用する方法を示します。 Start-Job コマンドと Wait-Job コマンドの両方が、Invoke-Command コマンドレットを使用してリモート コンピューターに送信されます。

この例では 、Wait-Job を 使用して、3 つの異なるコンピューターでバックグラウンド ジョブとして実行されている Get-Date コマンドが終了したかどうかを判断します。

最初のコマンドは、3 つのリモート コンピューターそれぞれにWindows PowerShell セッション (PSSession) を作成し、それらを $s 変数に格納します。

2 番目のコマンドでは 、Invoke-Command を 使用して、$sの 3 つのセッションのそれぞれで Start-Job を実行します。 すべてのジョブの名前は Date1 です。

3 番目のコマンドでは 、Invoke-Command を使用して Wait-Job を実行します。 このコマンドは、各コンピューターの Date1 ジョブが完了するまで待機します。 このコマンドは、ジョブ オブジェクトの結果のコレクション (配列) を $done 変数に格納します。

4 番目のコマンドでは、$done 変数内のジョブ オブジェクトの配列の Count プロパティを使用して、完了したジョブの数を決定します。

例 3: 最初のバックグラウンド ジョブがいつ終了するかを確認する

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

この例では、Wait-JobAny パラメーターを使用して、現在のセッションで実行されている多数のバックグラウンド ジョブの最初のジョブがいつ完了するかを判断します。 また、 Wait-Job コマンドレットを使用してリモート ジョブが完了するまで待機する方法も示します。

最初のコマンドは、Machines.txt ファイルにリストされている各コンピューターに PSSession を作成し、 PSSession オブジェクトを $s 変数に格納します。 コマンドは、Get-Content コマンドレットを使用してファイルの内容を取得します。 Get-Content コマンドは、New-PSSession コマンドの前に実行されるようにかっこで囲まれています。

2 番目のコマンドは、 Get-EventLog コマンド文字列を引用符で囲んで$c変数に格納します。

3 番目のコマンドでは、Invoke-Command コマンドレットを使用して、$sの各セッションで Start-Job を実行します。 Start-Job コマンドは、$c変数で Get-EventLog コマンドを実行するバックグラウンド ジョブを開始します。

このコマンドは、Using スコープ修飾子を使用して、$c 変数がローカル コンピューター上で定義されたことを示します。 Using スコープ修飾子は、Windows PowerShell 3.0 で導入されました。 Using scope 修飾子の詳細については、「about_Remote_Variables (https://go.microsoft.com/fwlink/?LinkID=252653)」を参照してください。

4 番目のコマンドでは 、Invoke-Command を 使用して、セッションで Wait-Job コマンドを実行します。 Any パラメーターを使用して、リモート コンピューター上の最初のジョブが完了するまで待機します。

例 4: リモート コンピューター上のジョブの待機時間を設定する

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

この例では、Wait-JobTimeout パラメーターを使用して、リモート コンピューターで実行されているジョブの最大待機時間を設定する方法を示します。

最初のコマンドは、3 台のリモート コンピューター (Server01、Server02、Server03) のそれぞれに PSSession を作成し、 PSSession オブジェクトを $s 変数に格納します。

2 番目のコマンドでは、Invoke-Command を使用して、$sの各 PSSession オブジェクトで Start-Job を実行します。 結果のジョブ オブジェクトが $jobs 変数に格納されます。

3 番目のコマンドでは 、Invoke-Command を 使用して、$sの各セッションで 待機ジョブ を実行します。 Wait-Job コマンドは、すべてのコマンドが 30 秒以内に完了したかどうかを判断します。 値が 30 の Timeout パラメーターを使用して最大待機時間を設定し、コマンドの結果を $done 変数に格納します。

この場合に、30 秒後に Server02 コンピューター上のコマンドのみが完了しました。 Wait-Job は 待機を終了し、コマンド プロンプトを表示し、完了したジョブを表す オブジェクトを返します。

$done 変数には、Server02 上で実行されたジョブを表すジョブ オブジェクトが含まれています。

例 5: 複数のジョブのいずれかが完了するまで待つ

PS C:\> Wait-Job -id 1,2,5 -Any

このコマンドは、ID によって 3 つのジョブを識別し、いずれかのジョブが完了するまで待機します。 コマンド プロンプトは、最初のジョブが完了すると を返します。

例 6: 期間を待ってから、ジョブをバックグラウンドで続行できるようにする

PS C:\> Wait-Job -Name "DailyLog" -Timeout 120

このコマンドは、DailyLog ジョブが完了するまで 120 秒 (2 分) 待機します。 ジョブが次の 2 分間に終了しない場合は、コマンド プロンプトが戻り、ジョブはバックグラウンドで実行され続けます。

例 7: 名前でジョブを待機する

PS C:\> Wait-Job -Name "Job3"

このコマンドは、ジョブ名を使用して、待機するジョブを識別します。

例 8: Start-Job で開始されたローカル コンピューター上のジョブを待機する

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

この例では、 Start-Job を使用して、ローカル コンピューターで開始されたジョブで Wait-Job コマンドレットを使用する方法を示します。

これらのコマンドは、過去 1 週間に追加または更新された Windows PowerShell スクリプト ファイルを取得するジョブを開始します。

最初のコマンドでは 、Start-Job を使用して、ローカル コンピューターでバックグラウンド ジョブを開始します。 ジョブは、前の週に追加または更新された .ps1 ファイル名拡張子を持つすべてのファイルを取得する Get-ChildItem コマンドを実行します。

3 番目のコマンドでは 、Wait-Job を使用してジョブが完了するまで待機します。 ジョブが完了すると、ジョブに関する情報を含むジョブ オブジェクトが表示されます。

例 9: Invoke-Command を使用してリモート コンピューターで開始されたジョブを待機する

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

この例では、Invoke-Command の AsJob パラメーターを使用して、リモート コンピューターで開始されたジョブで Wait-Job を使用する方法を示します。 AsJob を使用すると、ジョブはローカル コンピューター上に作成され、ジョブがリモート コンピューターで実行されている場合でも、結果はローカル コンピューターに自動的に返されます。

この例では 、Wait-Job を使用して、3 台のリモート コンピューター上のセッションで実行されている Get-Process コマンドが完了したかどうかを判断します。

最初のコマンドは、3 台のコンピューターに PSSession オブジェクトを作成し、$s変数に格納します。

2 番目のコマンドでは 、Invoke-Command を 使用して、$sの 3 つの各セッションで Get-Process を実行します。 コマンドは AsJob パラメーターを使用して、コマンドをバックグラウンド ジョブとして非同期的に実行します。 コマンドは 、Start-Job を使用して開始されたジョブと同様にジョブ オブジェクトを返し、ジョブ オブジェクトは $j 変数に格納されます。

3 番目のコマンドでは、パイプライン演算子 (|) を使用して、$j内のジョブ オブジェクトを Wait-Job コマンドレットに送信します。 この場合、ジョブはローカル コンピューター上に存在するため、 Invoke-Command コマンドは必要ありません。

例 10: ID を持つジョブを待機する

PS C:\> Get-Job

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

PS C:\> Wait-Job -Id 1

このコマンドは、ID 値が 1 であるジョブを待機します。

パラメーター

-Any

このコマンドレットによってコマンド プロンプトが表示され、ジョブが完了したときにジョブ オブジェクトが返されることを示します。 既定では、 Wait-Job は、指定されたすべてのジョブが完了するまで待機してから、プロンプトを表示します。

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

-Filter

条件のハッシュ テーブルを指定します。 このコマンドレットは、ハッシュ テーブル内のすべての条件を満たすジョブを待機します。 ジョブのプロパティをキー、ジョブのプロパティ値を値とするハッシュ テーブルを入力します。

このパラメーターは、ワークフロー ジョブ、スケジュールされたジョブなどの、カスタムのジョブの種類に対してのみ機能します。 Start-Job コマンドレットを使用して作成されたジョブなど、標準のバックグラウンド ジョブでは機能しません。 このパラメーターのサポートについては、ジョブの種類のヘルプ トピックを参照してください。

このパラメーターは Windows PowerShell 3.0 で導入されました。

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

-Force

このコマンドレットが、中断状態または切断状態のジョブを待機し続けるかどうかを示します。 既定では、ジョブが次のいずれかの状態にある場合、 Wait-Job は待機を返すか終了します。

  • 完了
  • 失敗
  • 停止済み
  • Suspended
  • [Disconnected](切断済み)

このパラメーターは Windows PowerShell 3.0 で導入されました。

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

-Id

このコマンドレットが待機するジョブの ID の配列を指定します。

ID は、現在のセッションのジョブを一意に識別する整数です。 インスタンス ID よりも覚えて入力する方が簡単ですが、現在のセッションでのみ一意です。 1 つ以上の ID をコンマで区切って入力できます。 ジョブの ID を検索するには、「」と入力します Get-Job

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

-InstanceId

このコマンドレットが待機するジョブのインスタンス ID の配列を指定します。 既定値はすべてのジョブです。

インスタンス ID は、コンピューター上のジョブを一意に識別する GUID です。 ジョブのインスタンス ID を調べるには、Get-Job を使用します。

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

-Job

このコマンドレットが待機するジョブを指定します。 ジョブ オブジェクトが格納されている変数、またはジョブ オブジェクトを取得するコマンドを入力します。 パイプライン演算子を使用して、 Wait-Job コマンドレットにジョブ オブジェクトを送信することもできます。 既定では、 Wait-Job は 現在のセッションで作成されたすべてのジョブを待機します。

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

-Name

このコマンドレットが待機するジョブのフレンドリ名を指定します。

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

-State

ジョブの状態を指定します。 このコマンドレットは、指定された状態のジョブのみを待機します。 このパラメーターの有効値は、次のとおりです。

  • NotStarted
  • 実行中
  • 完了
  • 失敗
  • 停止済み
  • Blocked
  • Suspended
  • [Disconnected](切断済み)
  • 中断中
  • 停止中

ジョブの状態の詳細については、MSDN ライブラリの 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 は、コマンドレットがジョブが完了するまで待機することを示します。 このタイミングは、Start-Job コマンドではなく、Wait-Job コマンドを送信すると開始されます。

この時間を超えた場合、ジョブがまだ実行中でも、待機が終了し、コマンド プロンプトが返されます。 このコマンドでは、エラー メッセージは表示されません。

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

入力

System.Management.Automation.RemotingJob

ジョブ オブジェクトをこのコマンドレットにパイプできます。

出力

System.Management.Automation.PSRemotingJob

このコマンドレットは、完了したジョブを表すジョブ オブジェクトを返します。 Timeout パラメーターの値を超えたために待機が終了した場合、Wait-Job はオブジェクトを返しません。

メモ

  • 既定では、ジョブが次のいずれかの状態にある場合、 Wait-Job は待機を返すか終了します。
  • 完了
  • 失敗
  • 停止済み
  • Suspended
  • Disconnected 待機ジョブ が中断ジョブと切断ジョブの待機を続行するには、 Force パラメーターを使用します。