【问题标题】:What is the syntax to subscribe to an object's static event in PowerShell?在 PowerShell 中订阅对象的静态事件的语法是什么?
【发布时间】:2010-03-02 23:45:13
【问题描述】:

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

更新TimeChanged 的正确语法:

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

很遗憾,PowerShell ISE 中不会发出 SystemEvents 信号。这是一个使用对象的 staic 事件的示例,该事件在任何地方都有效:

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

【问题讨论】:

  • PowerShell中有一个消息循环运行,但您需要以管理员身份运行才能访问它。

标签: events powershell powershell-2.0


【解决方案1】:

如果将静态类型分配给变量,则可以订阅静态事件。

例如:

$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 及更高版本上)运行才能访问消息。

【讨论】:

    【解决方案2】:

    史蒂文得到了正确的答案,因此无需对此投票(改为投票给他)。我只是想发布一个示例 sn-p,人们可以使用它来玩弄静态事件,这样您就不必找到易于触发的 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
    

    【讨论】:

    • 谢谢。我冒昧地在我的问题here 中借用了很多sn-p。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 2010-11-20
    • 1970-01-01
    相关资源
    最近更新 更多