Что синтаксис должен подписать на статическое событие объекта в PowerShell?

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

ОБНОВЛЕНИЕ: Правильный синтаксис для 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" }

7
задан George Tsiokos 2 March 2010 в 15:45
поделиться

2 ответа

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

Например:

$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 и более поздних версиях), чтобы получить доступ к сообщениям.

6
ответ дан 7 December 2019 в 05:21
поделиться

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

Похожие вопросы: