2012年6月8日金曜日

PowerShellのイベント処理

Powershell覚え書き

背景

Powershellでイベント処理ができないかと思い実験してみた。実際にやりたいことは、例えばログ解析処理をする常駐型のスクリプトがあった場合に、入力元のファイルが定期的に切り替わったり、定期的に集計結果を出力したい場合に常駐プロセスに対して、切り替わりのイベントを伝える手段がないかということです。

お題

Powershellにeventというものがあるので使ってみた。
function loop
{
    while ($true) {
        write-host("Runnnig..")
        sleep 1
        if ( !$running ) {break}     
    }
    write-host("out of loop!!")
}

$running = $true

#タイマーイベント登録
$timer = New-Object System.Timers.timer
$timer.interval = 10e3 #10 seconds
#$timer.enabled=$true
Register-ObjectEvent -InputObject $timer -EventName Elapsed `
    -SourceIdentifier Timer_test -Action {write-host("Timer Elapsed:");$global:running= $false} >$null
$timer.start()

#ループ
loop

unregister-event timer_test

簡単に解説

 タイマーイベントを10秒毎に発生させ、フラグ($running)を使ってメイン処理のループの処理を止めさせようとした。 

結果

 とりあえず動かせたが、変数のスコープで強引なことをやらないといけなかった。メインの処理もイベントの処理も確かに動いているのだが、イベント側で実行しているローカルスコープやスクリプトスコープで$runningを$falseに設定しても、メインの処理には反映されなかった。とりあえず、globalスコープとしたが、反則かなぁ。
 ネットの情報を見てもこんなことをやっている例が見つかってません。どなたかまともなやり方をお分かりの方がいらっしゃれば情報いただけると幸いでございます。

1 件のコメント:

  1. 下記ページが役立ちそうです
    http://d.hatena.ne.jp/rancomma/20111010/1318238853

    返信削除