add_NameOfEvent({scriptblock})
PowerShell では、オブジェクトの - メソッドを使用してイベントをサブスクライブできます。これは、ボタンなどの Form オブジェクトではうまく機能しますが、 a で試してみるとうまくいき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