PowerShellで複数の処理を同時に実行する際に便利なのが「バックグラウンドジョブ」です。ジョブとして実行した処理は非同期に進行するため、ユーザーは別のタスクを並行して行うことができます。そして、ジョブの実行結果を取得する際に使用するのが Receive-Job
コマンドです。この記事では Receive-Job
の基本的な使い方から、実務に役立つ具体的な使用例、注意点までをわかりやすく解説します。PowerShellで効率的にスクリプトを扱いたい方にとって必須の知識です。
Receive-Jobとは?
Receive-Job
は、PowerShellのバックグラウンドジョブから出力を受け取るためのコマンドレットです。ジョブとは、Start-Job
や ForEach-Object -Parallel
などで実行される非同期の処理です。これらのジョブはバックグラウンドで動作し、完了後にその結果を Receive-Job
を使って取得することができます。
例えば、以下のようにジョブを開始したとします。
$job = Start-Job -ScriptBlock { Get-Process }
このとき $job
にはジョブの情報が格納されており、ジョブが完了した後に次のようにして出力を受け取ります。
Receive-Job -Job $job
このように、Receive-Job
はジョブの結果を受け取るために不可欠なコマンドです。
基本的な使い方
Receive-Job
コマンドの主な構文は次の通りです。
Receive-Job [-Id] <Int32[]> [-Keep] [-Wait] [-Force] [<CommonParameters>]
Receive-Job [-Job] <Job[]> [-Keep] [-Wait] [-Force] [<CommonParameters>]
よく使うパラメーター
-Job
:ジョブオブジェクトを直接指定します。-Id
:ジョブIDを指定して取得します。-Name
:ジョブ名を指定して取得します。-Wait
:ジョブが完了するまで待機します。-Keep
:出力を取得後も削除せず残します。
たとえば、複数のジョブを処理しているときには次のようなコードが有効です。
$job1 = Start-Job -ScriptBlock { Get-Date; Start-Sleep -Seconds 3; Get-Date }
$job2 = Start-Job -ScriptBlock { Get-Service }
# 全ジョブの結果を取得
Get-Job | Receive-Job -Wait -Keep
ジョブの状態を確認するには
Receive-Job
を使う前に、ジョブが完了しているかどうかを確認することが重要です。Get-Job
コマンドを使うことで、ジョブの状態を把握できます。
Get-Job
ジョブのステータスには以下のような状態があります:
- Running:ジョブが実行中
- Completed:ジョブが正常終了
- Failed:ジョブが失敗
- Stopped:ジョブが手動停止
出力を安全に取得するには、ステータスが Completed
であることを確認しましょう。
Receive-Jobでの出力取得のタイミング
Receive-Job
は一度実行すると、そのジョブの出力は既定で「削除」されます。つまり、2回目以降は何も表示されません。
Receive-Job -Job $job # 1回目:出力あり
Receive-Job -Job $job # 2回目:出力なし
これを回避したい場合は -Keep
パラメーターを使用します。
Receive-Job -Job $job -Keep
また、ジョブの完了を待ってから出力を取得したいときは -Wait
を使います。
Receive-Job -Job $job -Wait
ジョブの出力を変数に格納する方法
受け取った出力をあとで使いたいときには、変数に代入して保存します。
$output = Receive-Job -Job $job -Wait -Keep
$output | Out-File "output.txt"
または、出力の加工・整形にも利用できます。
$output | Where-Object { $_.CPU -gt 100 }
このように、出力を変数に保持しておくことで柔軟な処理が可能になります。
ジョブのクリーンアップ
Receive-Job
を使って出力を取得したあとでも、ジョブはPowerShellセッションに残り続けます。不要なジョブを削除するには Remove-Job
を使います。
Get-Job | Remove-Job
これにより、メモリ使用量を抑え、セッションをクリーンに保てます。
エラーハンドリングと注意点
Receive-Job
は、ジョブが失敗した場合でも出力を表示しません。ジョブで発生したエラーは $job.ChildJobs[0].JobStateInfo.Reason
で確認できます。
$job = Start-Job -ScriptBlock { throw "エラーです" }
Wait-Job $job
$job.ChildJobs[0].JobStateInfo.Reason
ジョブの出力に加えて、エラー処理も適切に行うことで、堅牢なスクリプトを作成できます。
まとめ
Receive-Job
は、PowerShellで非同期処理を実現するジョブの出力を受け取るための重要なコマンドです。Start-Job
でバックグラウンド処理を走らせた後、Receive-Job
によってその結果を効率よく取得できます。-Keep
や -Wait
をうまく活用することで、出力の再利用や処理の待機も可能です。実務の中で複数の処理を並行して行う際や、スクリプトの自動化において強力な味方となるでしょう。ぜひ使いこなして、PowerShellスキルをワンランクアップさせてください。