2017年4月25日

【PowerShell】バックグラウンドジョブの実行


時間のかかる処理などをバックグランドで実行させることが出来ます。

#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"が一番時間がかかるのですが、結果では一番最初に表示されています。



スポンサーリンク