PowerShellには非同期処理を実行するためのコマンドがいくつか用意されています。その中でもStart-Jobは、非同期ジョブを開始し、バックグラウンドで処理を実行するための便利なコマンドです。本記事では、Start-Jobの基本的な使い方から、ジョブの管理方法、実用的な使用例まで詳しく解説します。非同期処理を活用することで、スクリプトの効率を大幅に向上させることができますので、ぜひ習得しましょう。
Start-Jobは、PowerShellで非同期ジョブを作成し、バックグラウンドで処理を実行するためのコマンドです。通常、PowerShellのコマンドは逐次実行されますが、Start-Jobを使用すると、指定した処理を並行して実行しながら、他の作業を続けることができます。
Start-Job -ScriptBlock { <実行したい処理> } -ScriptBlock パラメーターには、実行するスクリプトのコードを指定します。次の例では、5秒間スリープした後にメッセージを表示するジョブを実行します。
Start-Job -ScriptBlock {
Start-Sleep -Seconds 5
Write-Output "ジョブが完了しました"
} このコマンドを実行すると、即座にプロンプトが返ってきます。Start-Sleepが5秒間待機している間に他の作業を進めることができます。
実行中または完了したジョブの一覧を取得するには、Get-Jobコマンドを使用します。
Get-Job これにより、ジョブのID、状態、コマンドの概要などを確認できます。
ジョブの結果を取得するには、Receive-Jobコマンドを使用します。
Receive-Job -Id <ジョブID> または、すべてのジョブの結果を取得するには以下のようにします。
Receive-Job -Id (Get-Job).Id ArgumentList を使用してジョブにパラメーターを渡すことができます。
Start-Job -ScriptBlock {
param($name)
Write-Output "こんにちは、$name さん"
} -ArgumentList "太郎" ジョブの状態を監視し、完了を待つにはWait-Jobを使用します。
$job = Start-Job -ScriptBlock { Start-Sleep -Seconds 5; "ジョブが完了しました" }
Wait-Job -Id $job.Id
Receive-Job -Id $job.Id 以下のコードは、3つのジョブを並行して実行する例です。
$jobs = @(
Start-Job -ScriptBlock { Start-Sleep -Seconds 3; "Job 1 完了" },
Start-Job -ScriptBlock { Start-Sleep -Seconds 5; "Job 2 完了" },
Start-Job -ScriptBlock { Start-Sleep -Seconds 2; "Job 3 完了" }
)
Wait-Job -Job $jobs
$jobs | ForEach-Object { Receive-Job -Id $_.Id } 特定のジョブを停止するには、Stop-Jobを使用します。
Stop-Job -Id <ジョブID> すべてのジョブを停止する場合は次のようにします。
Stop-Job -Id (Get-Job).Id 完了したジョブを削除するには、Remove-Jobを使用します。
Remove-Job -Id <ジョブID> すべてのジョブを削除するには次のようにします。
Get-Job | Remove-Job Start-Jobで実行されるスクリプトは、現在のセッションとは異なるプロセスで動作するため、グローバル変数や関数は直接参照できません。RunspacesやThread Jobs (ForEach-Object -Parallel) の活用を検討すると良いでしょう。PowerShellのStart-Jobを使用すると、非同期処理を簡単に実装し、スクリプトの実行効率を向上させることができます。基本的な使い方から応用例、ジョブの管理方法まで解説しました。バックグラウンド処理を適切に活用し、PowerShellのスクリプトをより柔軟に運用しましょう。