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