2010-02-25 22 views
6

Register-ObjectEvent busca una instancia de objeto en el parámetro requerido InputObject. ¿Cuál es la sintaxis del evento estático de un objeto (Shared)?¿Cuál es la sintaxis para suscribirse al evento estático de un objeto en PowerShell?

ACTUALIZACIÓN: sintaxis correcta para TimeChanged:

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

Por desgracia, los SystemEvents no se señalizan en PowerShell ISE. He aquí una muestra usando evento staic de un objeto que funciona en todas partes:

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

Hay un bucle de mensajes ejecutándose en PowerShell, pero debe ejecutarlo como administrador para acceder a él. –

Respuesta

5

Si se asigna un tipo estático a una variable, puede suscribirse a los eventos estáticos.

Por ejemplo:

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

Para encontrar ningún evento estáticos un tipo puede tener, puede utilizar Get-Member con el interruptor -static

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

EDIT: Noté al intentar acceder a los eventos [Microsoft.Win32.SystemEvents], que necesitaba ejecutar en un mensaje elevado (en Vista y más arriba) para poder acceder a los mensajes.

2

Steven tiene la respuesta correcta, así que no hay necesidad de votar sobre esto (vote en su lugar). Solo quería publicar un fragmento de muestra que la gente pueda usar para jugar con eventos estáticos de modo que no tenga que encontrar un evento estático BCL que sea fácil de disparar. :-)

$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

Gracias Keith. Buen ejemplo! –

Cuestiones relacionadas