问题描述
在下面的脚本中,一个Action链接到Timer对象,但是即使Timer过去了(2000毫秒),该Action也不会执行。
缺少什么?
***Console (No Further Output)-***
14-08-2020 11:38:54 Action reached
Id - Name - PSJobTypeName - State - HasMoreData - Location - Command
5 -Timer.Elapsed ---------- NotStarted - False------------- Write-Output Get-D.....
***Script-***
Get-event | Remove-Event
Get-EventSubscriber | Unregister-Event
$Timer = New-Object System.Timers.Timer
$objectEventArgs = @{
InputObject = $Timer
EventName = 'Elapsed'
SourceIdentifier = 'Timer.Elapsed'
}
$Timer.Interval = 2000
$Timer.Autoreset = $true
$Timer.Enabled = $true
Write-Output $((Get-Date).ToString() + " Action reached")
$global:n = Write-Output $((Get-Date).ToString() + "Action block executed")
$action = { $n }
Register-ObjectEvent @objectEventArgs -Action $action
$Timer.start() #even calling timer start method doesn't trigger the action
解决方法
在操作块中用 Write-Host 替换了写入输出,此问题已解决。
Write-Output将输出通过cmdlet传递给管道,并且不会写入控制台。
要写入控制台,必须使用Write-Host。