2010-02-25 11 views
6

Register-ObjectEvent cerca un'istanza dell'oggetto nel parametro richiesto InputObject. Qual è la sintassi dell'evento statico (Shared condiviso di un oggetto?Qual è la sintassi per sottoscrivere l'evento statico di un oggetto in PowerShell?

UPDATE: la sintassi corretta per TimeChanged:

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

Purtroppo, i SystemEvents non verrà segnalata in PowerShell ISE. Ecco un esempio utilizzando evento staic di un oggetto che funziona ovunque:

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

C'è un ciclo di messaggi in esecuzione in PowerShell, ma è necessario eseguire come amministratore per accedervi. –

risposta

5

Se si assegna un tipo statico a una variabile, è possibile sottoscrivere gli eventi statici.

Ad esempio:

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

Per trovare tutti gli eventi statici un tipo può avere, è possibile utilizzare Get-Member con l'interruttore -Static

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

EDIT: ho notato durante il tentativo di accedere agli eventi [Microsoft.Win32.SystemEvents], che dovevo essere in esecuzione in un prompt con privilegi elevati (su Vista e sopra) per poter accedere ai messaggi.

2

Steven ha la risposta giusta, quindi non c'è bisogno di votare su questo (vota invece su di lui). Volevo solo pubblicare uno snippet di esempio che gli utenti possano utilizzare per giocare con eventi statici in modo da non dover trovare un evento statico BCL facile da attivare. :-)

$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 
+0

Grazie Keith. Bel esempio! –