PowerShellのバックグラウンドジョブ結果を取得する:Receive-Jobコマンドの使い方と活用例

PowerShellで複数の処理を同時に実行する際に便利なのが「バックグラウンドジョブ」です。ジョブとして実行した処理は非同期に進行するため、ユーザーは別のタスクを並行して行うことができます。そして、ジョブの実行結果を取得する際に使用するのが Receive-Job コマンドです。この記事では Receive-Job の基本的な使い方から、実務に役立つ具体的な使用例、注意点までをわかりやすく解説します。PowerShellで効率的にスクリプトを扱いたい方にとって必須の知識です。


Receive-Jobとは?

Receive-Job は、PowerShellのバックグラウンドジョブから出力を受け取るためのコマンドレットです。ジョブとは、Start-JobForEach-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スキルをワンランクアップさせてください。

タイトルとURLをコピーしました