在PowerShell中订阅对象的静态事件的语法是什么?

时间:2010-02-25 16:26:27

标签: events powershell powershell-v2.0

Register-ObjectEvent在必需参数 InputObject 中查找对象实例。对象的静态(共享)事件的语法是什么?

更新:更正TimeChanged的语法:

$systemEvents = [Microsoft.Win32.SystemEvents]
$timeChanged = Register-ObjectEvent -InputObject $systemEvents
-EventName 'TimeChanged' -Action { Write-Host "Time changed" }

不幸的是,SystemEvents不会在 PowerShell ISE 中发出信号。这是一个使用对象的staic事件的示例,它可以在任何地方使用:

$networkInformation = [System.Net.NetworkInformation.NetworkChange];
$networkAddressChanged = Register-ObjectEvent -InputObject $networkInformation 
-EventName 'NetworkAddressChanged' 
-Action { Write-Host "NetworkAddressChanged event signaled" }

2 个答案:

答案 0 :(得分:6)

如果为变量指定静态类型,则可以订阅静态事件。

例如:

$MyStaticType = [MyStaticNamespace.MyStaticClass]
Register-ObjectEvent -InputObject $MyStaticType -EventName MyStaticEvent -Action {Write-Host "Caught a static event"}

要查找某个类型可能包含的任何静态事件,可以将Get-Member与-Static开关一起使用

[MyStaticNamespace.MyStaticClass] | get-member -static -membertype event

修改 我在尝试访问[Microsoft.Win32.SystemEvents]事件时注意到,我需要在提升的提示符下运行(在Vista及更高版本上)才能访问这些消息。

答案 1 :(得分:2)

史蒂文得到了正确答案,因此无需对此进行投票(反而投票)。我只是想发布一个样本片段,人们可以使用它来玩静态事件,这样你就不必找到易于触发的BCL静态事件。 : - )

$src = @'
using System;

namespace Utils {
public static class StaticEventTest 
{
    public static event EventHandler Fired;

    public static void RaiseFired()
    {
        if (Fired != null) 
        { 
            Fired(typeof(StaticEventTest), EventArgs.Empty); 
        }
    }
}}
'@

$srcId = 'Fired'

Add-Type -TypeDefinition $src

Unregister-Event -SourceIdentifier $srcId -ea 0

$id = Register-ObjectEvent ([Utils.StaticEventTest]) Fired `
          -SourceIdentifier $srcId -Action {"The static event fired"}

[Utils.StaticEventTest]::RaiseFired()

while (!$id.HasMoreData) { Start-Sleep -Milliseconds 250 }

Receive-Job $id