非同期タイマー イベント (バックグラウンド プロセス) を使用して、適切なアクションを実行する前に特定の状態が発生している時間を測定する PowerShell スクリプトがあります。これは、PowerGUI 内でスクリプトを実行すると問題なく動作しますが、ドット ソースを使用してスクリプトを実行したり、バッチ ファイルを介してスクリプトを実行したりすると、Timer Event アクションが起動しません。
コードスニペットを次に示します。
$timer = New-Object System.Timers.Timer
$timer.Interval = 10000
$timer.AutoReset = $true
$timeout = 0
$action = {
"timeout: $timeout" | Add-Content $loglocation
<more stuff here>
$timer.stop()
}
$start = Register-ObjectEvent -InputObject $timer -SourceIdentifier TimerElapsed -EventName Elapsed -Action $action
$timer.start()
while(1)
{
<do some testing here>
}
そのため、動作すると、10 秒ごとに "timeout: XX" という出力がログに書き込まれます。ただし、これはエディター内で実行した場合にのみ発生します。バッチ ファイル経由で実行しても何も起こりません (ただし、while ループが正常に処理されていることは確認できます)。
私の質問は、PowerGUI 内でスクリプトを実行している場合と、コマンド ライン経由でスクリプトを実行している場合で、なぜ私の経験が異なるのでしょうか? 私の考えでは、スコープまたは並列スレッドに問題がある可能性がありますが、問題が何であるかは正確にはわかりません。また、関数やループ内でこれらのイベントを実行していません。