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スコープとしたが、反則かなぁ。ネットの情報を見てもこんなことをやっている例が見つかってません。どなたかまともなやり方をお分かりの方がいらっしゃれば情報いただけると幸いでございます。
下記ページが役立ちそうです
返信削除http://d.hatena.ne.jp/rancomma/20111010/1318238853