時間のかかる処理などをバックグランドで実行させることが出来ます。
例
#JobA
$a = {
for($i = 0; $i -le 9; $i++){
Start-Sleep -s 2
}
Write-Host "ジョブAが完了しました。"
}
#JobB
$b = {
for($i = 0; $i -le 3; $i++){
Start-Sleep -s 2
}
Write-Host "ジョブBが完了しました。"
}
#JobC
$c = {
for($i = 0; $i -le 5; $i++){
Start-Sleep -s 2
}
Write-Host "ジョブCが完了しました。"
}
#ジョブの開始
Start-Job -Name "JobA" $a
Start-Job -Name "JobB" $b
Start-Job -Name "JobC" $c
#実行中のすべてのジョブが完了するまで待機し、結果を受け取る
Get-Job -State Running | Wait-Job | Receive-Job
#ジョブの削除
Remove-Job -Name "JobA"
Remove-Job -Name "JobB"
Remove-Job -Name "JobC"
実行結果
Id Name PSJobTypeName State HasMoreData Location Command -- ---- ------------- ----- ----------- -------- ------- 35 JobA BackgroundJob Running True localhost ... 37 JobB BackgroundJob Running True localhost ... 39 JobC BackgroundJob Running True localhost ... ジョブAが完了しました。 ジョブBが完了しました。 ジョブCが完了しました。
Start-Jobでジョブが開始されますが、すぐに呼び出し元に制御が戻りますので、別の処理が実行できます。
上の例では、"JobA"という名前のジョブを実行したあとに、すぐに"JobB"、"JobC"というジョブを実行しています。
そして、Wait-Jobで実行中のジョブがすべて完了するまで待機し、ジョブが完了したらReceive-Jobで結果を受け取っています。
ちなみにジョブの結果表示は、開始したジョブの順番のようです。
"JobA"が一番時間がかかるのですが、結果では一番最初に表示されています。
スポンサーリンク