about_Jobs
簡単な説明
PowerShell バックグラウンド ジョブで、現在のセッションと対話せずにコマンドまたは式をバックグラウンドで実行する方法に関する情報を提供します。
長い説明
PowerShell は、ジョブを介してコマンドとスクリプトを同時に実行します。 コンカレンシーをサポートするために PowerShell によって提供されるジョブの種類は 3 種類です。
RemoteJob- コマンドとスクリプトはリモート セッションで実行されます。 詳細については、「about_Remote_Jobs」 を参照してください。BackgroundJob- コマンドとスクリプトは、ローカル コンピューター上の別のプロセスで実行されます。PSTaskJobまたはThreadJob- コマンドとスクリプトは、ローカル コンピューター上の同じプロセス内の別のスレッドで実行されます。 詳細については、「about_Thread_Jobs」 を参照してください。
スクリプトをリモートで、別のコンピューターまたは別のプロセスで実行すると、優れた分離が提供されます。 リモート ジョブで発生したエラーは、実行中の他のジョブや、ジョブを開始した親セッションには影響しません。 ただし、リモート処理レイヤーでは、オブジェクトのシリアル化を含むオーバーヘッドが追加されます。 すべてのオブジェクトは、親セッションとリモート (ジョブ) セッションの間で渡されるシリアル化および逆シリアル化されます。 大規模な複雑なデータ オブジェクトのシリアル化では、大量のコンピューティング リソースとメモリ リソースを消費し、ネットワーク全体で大量のデータを転送できます。
スレッド ベースのジョブは、異なるスレッドで同じプロセスで実行されるので、リモート ジョブやバックグラウンド ジョブほど堅牢ではありません。 1 つのジョブでプロセスがクラッシュする重大なエラーが発生した場合、プロセス内の他のすべてのジョブは終了します。
ただし、スレッド ベースのジョブでは、必要なオーバーヘッドが少なくなります。 リモート処理レイヤーやシリアル化は使用しません。 結果オブジェクトは、現在のセッションのライブ オブジェクトへの参照として返されます。 このオーバーヘッドがない場合、スレッド ベースのジョブの実行速度が向上し、他のジョブの種類よりも使用されるリソースが少なくなります。
重要
ジョブを作成した親セッションもジョブの状態を監視し、パイプライン データを収集します。 ジョブの子プロセスは、ジョブが完了状態になると親プロセスによって終了されます。 親セッションが終了すると、実行中のすべての子ジョブが子プロセスと共に終了します。
この状況を回避するには、次の 2 つの方法があります。
- を使用
Invoke-Commandして、切断されたセッションで実行されるジョブを作成します。 詳細については、「about_Remote_Jobs」 を参照してください。 - ジョブ
Start-Processではなく新しいプロセスを作成するには、 を使用します。 詳細については、「 Start-Process」を参照してください。
ジョブ コマンドレット
| コマンドレット | 説明 |
|---|---|
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}
PowerShell 6.0 から、パイプラインの最後にあるバックグラウンド演算子 (&) を使用して、バックグラウンド ジョブを開始できます。 詳細については、「background 演算子」 を参照してください。
background 演算子の使用は、前の例の コマンドレットを使用 Start-Job するのと機能的に同じです。
$job = Get-Process &
ジョブ オブジェクトの取得
コマンドレット Get-Job は、現在のセッションで開始されたバックグラウンド ジョブを表す オブジェクトを返します。 パラメーターを指定しない Get-Job 場合は、現在のセッションで開始されたジョブすべてが返されます。
Get-Job
ジョブ オブジェクトには、ジョブが完了したかどうかを示すジョブの状態が含まれている。 完了したジョブの状態は [ 完了] または [失敗] です。 ジョブがブロックまたは 実行中である****場合があります。
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Complete True localhost Get-Process
ジョブ オブジェクトを変数に保存し、それを使用して、後のコマンドでジョブを表します。 次のコマンドは、ID 1 のジョブを取得し、 変数に保存 $job します。
$job = Get-Job -Id 1
ジョブの結果を取得する
バックグラウンド ジョブを実行すると、結果はすぐには表示されません。 バックグラウンド ジョブの結果を取得するには、 コマンドレットを使用 Receive-Job します。
次の例では、 コマンドレット Receive-Job は、 変数内のジョブ オブジェクトを使用してジョブの結果を取得 $job します。
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
668 7 2672 6168 104 32.26 488 csrss
...
ジョブの結果を変数に保存できます。 次のコマンドは、ジョブの結果を 変数に $job 保存 $results します。
$results = Receive-Job -Job $job
部分的なジョブ結果の取得と保持
コマンドレット 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
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 ...
3 Job3 BackgroundJob Complete True localhost dir -Path C:\* -Re...
この場合、State プロパティ は 、ジョブ 2 がまだ実行されている状態を示します。 コマンドレットを使用してジョブの Receive-Job 結果を取得すると、結果は不完全になります。 コマンドレットを繰り返 Receive-Job し使用して、すべての結果を取得できます。 State プロパティ を使用 して、ジョブがいつ完了したのか確認します。
コマンドレットの Wait パラメーター を使用 Receive-Job することもできます。 このパラメーターを使用すると、ジョブが完了し、すべての結果が使用可能になるまで、コマンドレットはコマンド プロンプトを返します。
コマンドレットを使用して Wait-Job 、ジョブの結果の一部またはすべてが待機することもできます。 Wait-Job では、1 つ以上の特定のジョブまたはすべてのジョブを待機できます。
次のコマンドは、 コマンドレットを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 = Start-Job -ScriptBlock {New-Item -Path HKLM:\Software\MyCompany}
Get-Job $job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Failed False localhost New-Item -Path HKLM:...
Reason プロパティ を 調して、ジョブが失敗する原因となるエラーを見つける。
$job.ChildJobs[0].JobStateInfo.Reason
この場合、リモート コンピューターでコマンドを実行するために明示的な資格情報が必要だったため、ジョブは失敗しました。 Reason プロパティには、次のメッセージが含まれます。
"アクセスが拒否されました" というエラー メッセージが表示され、リモート サーバーへの接続に失敗しました。
関連項目
フィードバック
フィードバックの送信と表示