適用対象: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0
about_Jobs
Windows PowerShell バックグラウンド ジョブが現在のセッションと対話せずにバックグラウンドでコマンドまたは式を実行する方法について説明します。
このトピックでは、ローカル コンピューター上の Windows 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 コマンドレットを使用して、ジョブの結果をファイルに保存できます。次のコマンドは、リダイレクト演算子を使用して、$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
結果は、テーブルに表示されます。ジョブ ステータスは、[状態] 列に表示されます。
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
2 Job2 BackgroundJob Running True localhost Get-EventLog -Log Syst...
3 Job3 BackgroundJob Complete True localhost dir -Path C:\* -Recurse
この場合、State プロパティを参照すると、ジョブ 2 がまだ実行中であることがわかります。Receive-Job コマンドレットを使用してジョブ結果をすぐに入手した場合、結果は不完全なものになります。Receive-Job コマンドレットを繰り返し使用すると、すべての結果を取得できます。既定では、このコマンドレットを使用するたびに、まだ受け取っていない結果のみが返されますが、既に受け取っていても、Receive-Job コマンドレットの Keep パラメーターを使用すると、結果を保持できます。
結果の一部をファイルに書き込んで新しい結果が届くたびに追加することも、待機して後でジョブの状態を確認することもできます。
Receive-Job コマンドレットの Wait パラメーターを使用すると、ジョブが完了し、すべての結果が使用できるまで、コマンド プロンプトが返されません。
また、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 PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Failed False localhost New-Item -Path HKLM:\S...
次のコマンドは、Reason プロパティを使用して、ジョブが失敗する原因となったエラーを見つけます。
$job.ChildJobs[0].JobStateInfo.Reason
この場合、ジョブが失敗したのは、リモート コンピューターでコマンドを実行するには明示的な資格情報が必要であったためです。Reason プロパティの値は次のとおりです。
Connecting to remote server failed with the following error
message : Access is denied.
about_Remote_Jobs
about_Job_Details
about_Remote に関するページ
about_PSSessions
Start-Job
Get-Job
Receive-Job
Stop-Job
Wait-Job
Remove-Job
Invoke-Command