2009/10/06

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

古い記事へ | 新しい記事へ


プライバシーポリシー

Twitter

Books