Job Event for powershell
Powershell jobの終了通知
Register-ObjectEvent で終了通知可能。
Register-ObjectEvent $job -EventName StateChanged -SourceIdentifier ハンドラ名 -Action { アクション }
取扱物件は
- ターゲットジョブ
- ハンドラ
- ハンドラジョブ
ハンドラを登録するとハンドラジョブが作成される。よって終了通知の後処理は下記の3つ
- ハンドラ削除
- ターゲットジョブ破棄
- ハンドラジョブ破棄
上記を踏まえた基本の流れ。
- ターゲットジョブ起動
- ハンドラ登録
- 後処理1 (ハンドラジョブ)ハンドラ削除とターゲットジョブ破棄
- 後処理2 (メイン側など) ハンドラジョブ破棄
後処理1はハンドラジョブが実施。ハンドラジョブ終了後に、誰かが後処理2を実施。ハンドラジョブが自ジョブを破棄できない前提。
ハンドラジョブ破棄は、次回のジョブ実行前などに実施。
但し、ハンドラ削除前にハンドラジョブ破棄すると、ハンドラ削除に失敗する。仕方なく、毎回ハンドラ名を変えてハンドラ登録する。
破棄できないハンドラが残る点が気になる。PowerShell終了で見えなくなるが、悩ましい。
やってみた事
- ハンドラ登録すると、ハンドラジョブが作成される。
- NotStarted状態のハンドラジョブを破棄できない。
- Failed状態?のハンドラジョブなら破棄可能。
- ハンドラジョブを破棄すると、ハンドラを削除できない。
とにかく、ハンドラを削除できないのが宜しくない。最初にハンドラを削除し、その後にターゲットジョブ、ハンドラジョブを削除する。
ダメだったもの
Get-EventSubscriber -force | Unregister-Event -force
結局、Unregister-Event -Forceでもジョブが破棄されるとハンドラを削除できない。セッション終了まで待つしか無い
コード例
$job = Start-Job { Dir $env:windir *.jpg -r -ea SilentlyContinue} -Name "WinDirの検索" Register-ObjectEvent $job -EventName StateChanged ` -SourceIdentifier JobStateChanged ` -Action { Write-Host "JOb「$($sender.Name)」が $($event.TimeGenerated) に終了" Write-Host "★結果は★" Receive-Job -Id ($sender.id) | Write-Host $global:sender1 = $sender $global:event1 = $Event $global:subscriber = $EventSubscriber $global:source = $SourceEventArgs $global:SourceArgs1 = $SourceArgs Unregister-Event -SourceIdentifier JobStateChanged }
関連コマンド
Unregister-Event
先にRemove-Jobされると-Forceをつけてもエラーとなり破棄できない。永遠に破棄できない?
Unregister-Event失敗
Register-ObjectEventにより、Event-Jobが自動的に登録される。Unregisterする前にEvent-JobをRemove-Jobにより破棄すると、その後のUnregister-Eventがエラーする。しかも、Unregister-Event -Forceするとエラーは出ないが破棄できない。但し、Powershell Consoleを終了すると破棄される。
Remove-Job
Running中のJobをRemove-Jobするとエラーになる。-Forceで破棄できる模様。
Remove-Job *
纏めて破棄。
Get-EventSubscriber
登録中のイベントハンドラー一覧表示。
Remove-Event
使った事なし
ジョブ状態
下記の6種類。PSv2.0
- Blocked
- Running
- Completed
- Failed
- NotStarted
- Stopped
参考
http://mtgpowershell.blogspot.jp/2010/11/blog-post_21.html?m=1
http://blog.powershell-from.jp/?p=121
http://blog.powershell-from.jp/?cat=32
http://dobon.net/vb/dotnet/vb2cs/event.html
以上