2010-02-25 25 views
6

Register-ObjectEvent查找所需參數中的對象實例InputObject。什麼是對象的靜態語法(共享)事件?在PowerShell中訂閱對象的靜態事件的語法是什麼?

UPDATE:正確的語法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" } 
+1

在PowerShell中有一個消息循環運行,但您需要以管理員身份運行才能訪問它。 – 2010-03-02 02:08:55

回答

5

如果您分配一個靜態類型的變量,你可以訂閱靜態事件。

例如:

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

要找到任何靜態事件類型可能有,你可以使用Get-Member與 - 靜態開關

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

編輯: 我沒有通知當試圖訪問[Microsoft.Win32.SystemEvents]事件時,我需要在提升的提示符下(在Vista和更高版本上)運行以訪問消息。

2

史蒂文得到了正確的答案,所以沒有必要對此投票(對他投票)。我只是想發佈一個樣本片段,人們可以使用這些片段來處理靜態事件,這樣您就不必找到易於觸發的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 
+0

感謝Keith。很好的例子! – 2010-03-02 02:05:29

相關問題