about_Jobs
トピック
about_Jobs
簡易説明
Windows PowerShell バックグラウンド ジョブが、現在のセッションと対話することなく、バックグラウ
ンドでコマンドまたは式を実行する方法について説明します。
詳細説明
このトピックでは、ローカル コンピューターにおいて Windows PowerShell でバックグラウンド ジョブ
を実行する方法について説明します。リモート コンピューターでのバックグラウンド ジョブの実行の詳
細については、「about_Remote_Jobs」を参照してください。
バックグラウンド ジョブを開始すると、ジョブの完了に時間がかかる場合でも、すぐコマンド プロンプ
トに戻ります。ジョブの実行中に、中断することなく引き続きセッションで作業できます。
重要: Start-Job、または Invoke-Command の AsJob パラメーターを使用して開始するバックグ
ラウンド ジョブは、Windows PowerShell リモート処理インフラストラクチャに依存しています。
これらの機能を使用するには、バックグラウンド ジョブがローカル コンピューターのみで実行さ
れる場合でも、Windows PowerShell がリモート処理用に構成されている必要があります。詳細につ
いては、「about_Remote_Requirements」を参照してください。
ローカル コンピューターでジョブを開始する方法
ローカル コンピューターでバックグラウンド ジョブを開始するには、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 は現在のセッションで
開始されたすべてのジョブを返します。
たとえば、次のコマンドは現在のセッションのジョブを取得します。
get-job
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Running True localhost get-process
変数にジョブ オブジェクトを保存し、この変数を使用して後のコマンドでジョブを表すこともできま
す。次のコマンドは、ID 1 というジョブを取得し、これを $job 変数に保存します。
$job = get-job -id 1
ジョブ オブジェクトにはジョブの状態が含まれており、これはジョブが完了したかどうかを示していま
す。完了したジョブの状態は、"Complete" または "Failed" になります。ジョブはブロックするこ
とも、実行することもできます。
get-job
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 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 コマンドレットを使用すると、ジョブの結果をフ
ァイルに保存することもできます。次のコマンドは、リダイレクト演算子を使用して、$job 変数内のジ
ョブの結果を Results.txt ファイルに保存します。
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 State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Complete True localhost get-process
2 Job2 Running True localhost get-eventlog -log syst...
3 Job3 Complete True localhost dir -path c:\* -recurse
この場合、State プロパティは、Job 2 が引き続き実行中であることを示しています。Receive-Job
コマンドレットを使用してジョブの結果をすぐに取得すると、結果は不完全になります。Receive-Job コ
マンドレットを繰り返し使用すると、すべての結果を取得できます。既定では、そのコマンドレットを使
用するたびに、まだ受け取られていない結果のみを取得しますが、Receive-Job コマンドレットの
Keep パラメーターを使用すると、結果が既に受け取られている場合でも結果を保持することができま
す。
このとき、結果をファイルに書き込み、その後、新しく受け取った結果が得られたら、それをファイルに
付加することができます。または、待機して後でジョブの状態を確認することができます。
または、Wait-Job コマンドレットを使用して、ジョブの結果のいずれかまたは全部が完了するまで待
つことができます。Wait-Job を使用すると、特定のジョブ、すべてのジョブ、またはいずれかのジョブ
が完了するまで待つことができます。
次のコマンドは、Wait-Job コマンドレットを使用して、ID 10 のジョブを待ちます。
wait-job -ID 10
この結果、ジョブが完了するまで、Windows 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 State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Failed False localhost new-item -path HKLM:\S...
次のコマンドは、Reason プロパティを使用して、ジョブの失敗の原因となったエラー見つけます。
$job.ChildJobs[0].JobStateInfo.Reason
この場合、ジョブが失敗したのは、リモート コンピューターがコマンドを実行するために明示的な資格
情報を必要としたためです。Reason プロパティの値は、次のとおりです。
リモート サーバーへの接続が失敗し、次のエラー メッセージが返されました。アクセスが拒否さ
れました。
ジョブ コマンドレット
Start-Job ローカル コンピューターでバックグラウンド ジョブを開始します。
Get-Job 現在のセッションで開始されたバックグラウンド ジョブを取得します。
Receive-Job バックグラウンド ジョブの結果を取得します。
Stop-Job バックグラウンド ジョブを停止します。
Wait-Job 1 つまたはすべてのジョブが完了するまでコマンド プロンプトを表示しません。
Remove-Job バックグラウンド ジョブを削除します。
Invoke-Command AsJob パラメーターは、どのコマンドでも、リモート コンピューターのバックグラウ
ンド ジョブとして実行します。Invoke-Command を使用すると、リモートで Start-Job
コマンドなど、どのジョブ コマンドでも実行することができます。
関連項目
about_Remote_Jobs
about_Job_Details
about_Remote
about_PSSessions
Start-Job
Get-Job
Receive-Job
Stop-Job
Wait-Job
Remove-Job
Invoke-Command