Ho uno script PowerShell che utilizza un evento timer asincrono (processo in background) per misurare la durata di una determinata condizione prima di intraprendere l'azione appropriata. Funziona perfettamente quando eseguo lo script all'interno di PowerGUI, ma quando eseguo lo script utilizzando dot-sourcing o lo eseguo tramite un file batch, le azioni dell'evento timer non vengono attivate.Eventi timer asincroni PowerShell non funzionanti al di fuori della console di test
Ecco uno snippet di codice.
$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>
}
Quindi quando funziona, vedrò l'output "timeout: XX" ogni 10 secondi scritto nel registro. Ma questo succede solo quando viene eseguito all'interno dell'editor. Quando lo eseguo tramite file batch non succede nulla (anche se posso confermare che il ciclo while sta funzionando bene).
Quindi la mia domanda è perché la mia esperienza è diversa quando eseguo lo script all'interno di PowerGUI rispetto alla riga di comando? Il mio pensiero è che potrebbe esserci un problema con l'ambito o i thread paralleli, ma non sono esattamente sicuro di quale sia il problema. Inoltre non sto eseguendo questi eventi all'interno di alcuna funzione o loop.