Каков синтаксис подписки на статическое событие объекта в PowerShell? - PullRequest
7 голосов
/ 25 февраля 2010

Register-ObjectEvent ищет экземпляр объекта в обязательном параметре InputObject . Каков синтаксис статического ( Shared ) события объекта?

ОБНОВЛЕНИЕ : правильный синтаксис для TimeChanged :

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

К сожалению, события SystemEvents не будут переданы в PowerShell ISE . Вот пример использования статического события объекта, которое работает везде:

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

Ответы [ 2 ]

6 голосов
/ 02 марта 2010

Если вы назначаете статический тип переменной, вы можете подписаться на статические события.

Например:

$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

EDIT: Я заметил, когда пытался получить доступ к событиям [Microsoft.Win32.SystemEvents], что для доступа к сообщениям мне нужно было работать с повышенными привилегиями (в Vista и выше).

2 голосов
/ 02 марта 2010

Стивен получил правильный ответ, так что нет необходимости голосовать за него (проголосуйте за него). Я просто хотел опубликовать образец фрагмента, который люди могут использовать для игры со статическими событиями, так что вам не нужно находить статическое событие 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
...