概要
PowerShell バックグラウンド ジョブが、現在のセッションと対話せずにバックグラウンドでコマンドまたは式を実行する方法に関する情報を提供します。
詳細説明
このトピックでは、ローカル コンピューター上の PowerShell でバックグラウンド ジョブを実行する方法について説明します。 リモート コンピューターでのバックグラウンド ジョブの実行については、「 about_Remote_Jobs」を参照してください。
バックグラウンド ジョブを開始すると、ジョブの完了に時間がかかる場合でも、コマンド プロンプトはすぐに返されます。 ジョブの実行中は、中断されることなく引き続きセッションで作業できます。
ジョブ コマンドレット
| コマンドレット | 説明 |
|---|---|
Start-Job |
ローカル コンピュータでバックグラウンド ジョブを開始します。 |
Get-Job |
で開始されたバックグラウンドジョブを取得します。 |
| 現在のセッション。 | |
Receive-Job |
バックグラウンド ジョブの結果を取得します。 |
Stop-Job |
バックグラウンド ジョブを停止します。 |
Wait-Job |
1 つまたはすべてのジョブが |
| 完成。 | |
Remove-Job |
バックグラウンド ジョブを削除します。 |
Invoke-Command |
AsJob パラメーターは、任意のコマンドをバックグラウンドとして実行します |
| ジョブをリモート コンピューター上で実行します。 また、 | |
Invoke-Command 任意のジョブコマンドをリモートで実行するには、 |
|
| Start-Job コマンドを含みます。 |
ローカル コンピューターでジョブを開始する方法
ローカル コンピューターでバックグラウンド ジョブを開始するには、Start-Job コマンドレットを使用します。
Start-Job コマンドを記述するには、ジョブが実行するコマンドを中括弧 ( { } ) で囲みます。 ScriptBlock パラメータを使用して、コマンドを指定します。
次のコマンドは、ローカル コンピューターで Get-Process コマンドを実行するバックグラウンド ジョブを開始します。
Start-Job -ScriptBlock {Get-Process}
Start-Job コマンドは、ジョブを表すオブジェクトを返します。 ジョブ オブジェクトには、ジョブに関する有用な情報が含まれていますが、ジョブの結果は含まれていません。
ジョブ オブジェクトを変数に保存し、それを他の Job コマンドレットと共に使用してバックグラウンド ジョブを管理します。 次のコマンドは、ジョブ オブジェクトを開始し、結果のジョブ オブジェクトを $job 変数に保存します。
$job = Start-Job -ScriptBlock {Get-Process}
また、 Get-Job コマンドレットを使用して、現在のセッションで開始されたジョブを表すオブジェクトを取得することもできます。
Get-Job Start-Job が返すのと同じジョブ オブジェクトを返します。
ジョブオブジェクトの取得
現在のセッションで開始されたバックグラウンド ジョブを表すオブジェクトを取得するには、 Get-Job コマンドレットを使用します。 パラメーターがない場合、Get-Job は現在のセッションで開始されたすべてのジョブを返します。
たとえば、次のコマンドは、現在のセッションのジョブを取得します。
PS C:> Get-Job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Running True localhost Get-Process
また、ジョブ・オブジェクトを変数に保存し、それを使用して後のコマンドでジョブを表すこともできます。 次のコマンドは、ID が 1 のジョブを取得し、$job 変数に保存します。
$job = Get-Job -Id 1
ジョブ オブジェクトには、ジョブが終了したかどうかを示すジョブの状態が含まれています。 完了したジョブの状態は "完了" または "失敗" です。 ジョブがブロックされているか、実行中である可能性もあります。
Get-Job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
ジョブの結果の取得
バックグラウンド ジョブを実行しても、結果はすぐには表示されません。
代わりに、Start-Job コマンドレットはジョブを表すジョブ オブジェクトを返しますが、結果は含まれません。 バックグラウンド ジョブの結果を取得するには、Receive-Job コマンドレットを使用します。
次のコマンドでは、Receive-Job コマンドレットを使用してジョブの結果を取得します。 $job変数に保存されたジョブオブジェクトを使用して、ジョブを識別します。
Receive-Job -Job $job
Receive-Job コマンドレットは、ジョブの結果を返します。
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
668 7 2672 6168 104 32.26 488 csrss
# ...
ジョブの結果を変数に保存することもできます。 次のコマンドは、ジョブの結果を $job 変数の $results 変数に保存します。
$results = Receive-Job -Job $job
また、リダイレクト演算子 (>) または Out-File コマンドレットを使用して、ジョブの結果をファイルに保存できます。 次のコマンドは、リダイレクト演算子を使用して、ジョブの結果を Results.txt ファイルの $job 変数に保存します。
Receive-Job -Job $job > results.txt
部分的なジョブ結果の取得と保持
Receive-Job コマンドレットは、バックグラウンド ジョブの結果を取得します。 ジョブが完了すると、Receive-Job はすべてのジョブ結果を取得します。 ジョブがまだ実行中の場合、Receive-Job はこれまでに生成された結果を取得します。
Receive-Job コマンドをもう一度実行して、残りの結果を取得できます。
Receive-Job が結果を返すとき、デフォルトでは、ジョブの結果が格納されているキャッシュからそれらの結果を削除します。 別の Receive-Job コマンドを実行すると、まだ受信されていない結果のみが得られます。
次のコマンドは、ジョブが完了する前に実行 Receive-Job コマンドの結果を示しています。
C:\PS> Receive-Job -Job $job
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
C:\PS> Receive-Job -Job $job
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
68 3 2632 664 29 0.36 1388 ccmsetup
749 22 21468 19940 203 122.13 3644 communicator
905 7 2980 2628 34 197.97 424 csrss
1121 25 28408 32940 174 430.14 3048 explorer
Receive-Job返したジョブ結果が削除されないようにするには、Keep パラメーターを使用します。 その結果、 Receive-Job は、その時点までに生成されたすべての結果を返します。
次のコマンドは、まだ完了していないジョブで Keep パラメーターを使用した場合の影響を示しています。
C:\PS> Receive-Job -Job $job -Keep
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
C:\PS> Receive-Job -Job $job -Keep
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
103 4 11328 9692 56 1176 audiodg
804 14 12228 14108 100 101.74 1740 CcmExec
68 3 2632 664 29 0.36 1388 ccmsetup
749 22 21468 19940 203 122.13 3644 communicator
905 7 2980 2628 34 197.97 424 csrss
1121 25 28408 32940 174 430.14 3048 explorer
結果を待つ
完了に時間がかかるコマンドを実行する場合は、ジョブ オブジェクトのプロパティを使用して、ジョブが完了したタイミングを判断できます。 次のコマンドは、 Get-Job オブジェクトを使用して、現在のセッションのすべてのバックグラウンド ジョブを取得します。
Get-Job
結果はテーブルに表示されます。 ジョブのステータスが [State] 列に表示されます。
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
2 Job2 BackgroundJob Running True localhost Get-EventLog -Log ...
3 Job3 BackgroundJob Complete True localhost dir -Path C:\* -Re...
この場合、State プロパティは、ジョブ 2 がまだ実行中であることを示します。
Receive-Job コマンドレットを使用してジョブの結果を今すぐ取得する場合、結果は不完全になります。
Receive-Job コマンドレットを繰り返し使用して、すべての結果を取得できます。 既定では、使用するたびに、まだ受信されていない結果のみが表示されますが、Receive-Job コマンドレットの Keep パラメーターを使用すると、既に受信されている結果に関係なく、結果を保持できます。
部分的な結果をファイルに書き込んでから、新しい結果が到着したら追加することも、後でジョブの状態を確認してからでもかまいません。
Receive-Job コマンドレットの Wait パラメーターを使用すると、ジョブが完了し、すべての結果が利用可能になるまでコマンド プロンプトが返されません。
Wait-Job コマンドレットを使用して、ジョブの結果の一部またはすべてを待機することもできます。
Wait-Job 特定のジョブ、すべてのジョブ、またはいずれかのジョブが完了するまで待機できます。
次のコマンドは、Wait-Job コマンドレットを使用して、ID が 10 のジョブを待機します。
Wait-Job -ID 10
その結果、PowerShell プロンプトはジョブが完了するまで抑制されます。
また、所定の期間待機することもできます。 このコマンドは、Timeout パラメータを使用して、待機を 120 秒に制限します。 時間が経過すると、コマンド プロンプトが返されますが、ジョブはバックグラウンドで引き続き実行されます。
Wait-Job -ID 10 -Timeout 120
ジョブの停止
バックグラウンド ジョブを停止するには、Stop-Job コマンドレットを使用します。 次のコマンドは、システム イベント ログ内のすべてのエントリを取得するジョブを開始します。 ジョブ・オブジェクトを$job変数に保存します。
$job = Start-Job -ScriptBlock {Get-EventLog -Log System}
次のコマンドはジョブを停止します。 パイプライン演算子 (|) を使用して、$job 変数のジョブを Stop-Job に送信します。
$job | Stop-Job
ジョブの削除
バックグラウンド ジョブを削除するには、Remove-Job コマンドレットを使用します。 次のコマンドは、$job 変数内のジョブを削除します。
Remove-Job -Job $job
失敗したジョブの調査
ジョブが失敗した理由を調べるには、ジョブ オブジェクトの Reason サブプロパティを使用します。
次のコマンドは、必要な資格情報なしでジョブを開始します。 ジョブ・オブジェクトを$job変数に保存します。
$job = Start-Job -ScriptBlock {New-Item -Path HKLM:\Software\MyCompany}
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Failed False localhost New-Item -Path HKLM:...
次のコマンドは、Reason プロパティを使用して、ジョブが失敗した原因となったエラーを見つけます。
$job.ChildJobs[0].JobStateInfo.Reason
この場合、リモート コンピューターでコマンドを実行するために明示的な資格情報が必要なため、ジョブは失敗しました。 Reason プロパティの値は次のとおりです。
リモート サーバーへの接続が失敗し、次のエラー メッセージが表示されます: アクセスが拒否されました。