qshinoの日記

Powershell関係と徒然なこと

Job Event for powershell

Powershell jobの終了通知

Register-ObjectEvent で終了通知可能。

Register-ObjectEvent $job -EventName StateChanged -SourceIdentifier ハンドラ名 -Action { アクション }

取扱物件は

  1. ターゲットジョブ
  2. ハンドラ
  3. ハンドラジョブ

ハンドラを登録するとハンドラジョブが作成される。よって終了通知の後処理は下記の3つ

  1. ハンドラ削除
  2. ターゲットジョブ破棄
  3. ハンドラジョブ破棄

上記を踏まえた基本の流れ。

  1. ターゲットジョブ起動
  2. ハンドラ登録
  3. 後処理1 (ハンドラジョブ)ハンドラ削除とターゲットジョブ破棄
  4. 後処理2 (メイン側など) ハンドラジョブ破棄

後処理1はハンドラジョブが実施。ハンドラジョブ終了後に、誰かが後処理2を実施。ハンドラジョブが自ジョブを破棄できない前提。

ハンドラジョブ破棄は、次回のジョブ実行前などに実施。

但し、ハンドラ削除前にハンドラジョブ破棄すると、ハンドラ削除に失敗する。仕方なく、毎回ハンドラ名を変えてハンドラ登録する。

破棄できないハンドラが残る点が気になる。PowerShell終了で見えなくなるが、悩ましい。

やってみた事

  1. ハンドラ登録すると、ハンドラジョブが作成される。
  2. NotStarted状態のハンドラジョブを破棄できない。
  3. Failed状態?のハンドラジョブなら破棄可能。
  4. ハンドラジョブを破棄すると、ハンドラを削除できない。

とにかく、ハンドラを削除できないのが宜しくない。最初にハンドラを削除し、その後にターゲットジョブ、ハンドラジョブを削除する。

ダメだったもの

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

以上