2009/10/06
[PSv2]ジョブが完了したらメッセージボックスを出す
PowerShell v2のバックグラウンドジョブ機能は便利ですが、
$job=Start-Job {Start-Sleep -sec 10;”done”}
などとした場合、このジョブが終了したかどうかをまず
$job
で調べ、終了していたら
Receive-Job $job
のようにしないと結果を表示できません。これはわりかし不便なので、ジョブが終了したらダイアログを出すように工夫してみました。
function StartAndNotify-Job { param([scriptblock]$ScriptBlock) $jobId = "JobWatcher" $global:job = Start-Job $ScriptBlock $global:watcherJob = Register-ObjectEvent -EventName StateChanged -InputObject $job -SourceIdentifier $jobId -Action ` { [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") $recievedString = Receive-Job $job if($recievedString -eq $null){$recievedString = ""} if($job.State -eq "Completed") { [System.Windows.Forms.MessageBox]::Show($recievedString,$job.Command,"OK","Asterisk") } else { [System.Windows.Forms.MessageBox]::Show($job.Command + "は失敗しました。`r`n詳細はReceive-Job -id " + $job.Id + " を実行し確認してください。",$job.Command,"OK","Error") } Unregister-Event "JobWatcher" Remove-Job $global:watcherJob } }
使用例
StartAndNotify-Job {Start-Sleep -sec 10;”done”}
このように、スクリプトブロックを渡しておくとバックグラウンド処理が走り、終わるとメッセージボックスが出て、出力結果があるとそれを表示します。エラーが発生した場合はその旨を表示します。便利です。
本当はエラーが出た場合はエラー内容を表示させたいんですがやり方がわかりませんでした。なので、エラーを表示させる方法のみ表示します。
元記事:http://blogs.wankuma.com/mutaguchi/archive/2009/10/06/181919.aspxプライバシーポリシー