В PowerShell вы можете подписаться на событие, используя add_NameOfEvent({scriptblock})
-метод объекта. Это хорошо работает для объектов формы, таких как кнопки и т. д. Однако, когда я попробовал это с System.Timers.Timer
, это не сработало. Почему это? Образец:
$timer1 = New-Object System.Timers.Timer
$timer1.Interval = 2000
$timer1.add_Elapsed({ Write-Host "Timer1 tick" })
$timer2 = New-Object System.Timers.Timer
$timer2.Interval = 2000
Register-ObjectEvent -InputObject $timer2 -EventName Elapsed -Action { Write-Host "Timer2 tick" }
$timer1.Start()
$timer2.Start()
$timer2
будет работать нормально, но $timer1
никогда не будет писать в консоль. Чем Timer
отличается от бывшего. компонент формы (где работает метод add_...
)? Запускается ли Timer
в отдельном потоке и из-за этого пишет в "скрытую" консоль?
Доказательство того, что метод работает с компонентами форм для тех, кто с ним не знаком:
PS > Add-Type -AssemblyName System.Windows.Forms
PS > $b = New-Object System.Windows.Forms.Button
PS > $b.add_click({ Write-Host "button" })
#Get-EventSubscriber won't show this event, but it's added
PS > $b.PerformClick()
button