Receive-jobで進行状況を随時取得
自作関数をStart-Jobを使ってバックグラウンド実行するなら、やはり進行状況はしりたいところだ。そこで、Receive-jobで進行状況を随時取得する例を作ってみた。
function DoTestFunction
{
Write-output "TestFunction start"
(1..10) | ForEach-Object { sleep 1;
(date).ToString()
}
Write-output "TestFunction End"
}
#バックグラウンドジョブとして関数を実行
Write-Host "Background Job(DoTestFunction) Start"
$ScriptBlock = (Get-Command DoTestFunction).ScriptBlock
$job = Start-Job -ScriptBlock $ScriptBlock
sleep 1
#バックグラウンドジョブとして実行中の関数の処理状況(途中経過)を取得
while ($job.State -ne "Completed") {
$Ret = Receive-job -Job $job
$Ret
sleep 3
}
#バックグラウンドジョブとして実行完了した関数の処理結果を取得
$Ret = Receive-job -Job $job
$Ret
#バックグラウンドジョブとして実行完了した関数の後始末
remove-job -Job $job
Write-Host "Background Job(DoTestFunction) End"
自作関数(DoTestFunction)は、1秒周期で10回日時を出力する。スクリプトのメインは、Start-Jobで自作関数をバックグラウンドプロセスとしてキックした後、プロセスが完了するまで3秒周期で処理結果を取得する。
実行結果
Background Job(DoTestFunction) Start TestFunction start 2021/08/29 23:53:25 2021/08/29 23:53:26 2021/08/29 23:53:27 2021/08/29 23:53:28 2021/08/29 23:53:29 2021/08/29 23:53:30 2021/08/29 23:53:31 2021/08/29 23:53:32 2021/08/29 23:53:33 2021/08/29 23:53:34 TestFunction End Background Job(DoTestFunction) End
コメント