訂閱 Microsoft .NET Framework 物件所產生的事件。

語法

Register-ObjectEvent [-InputObject] <psobject> [-EventName] <string> [[-SourceIdentifier] <string>] [[-Action] <scriptblock>] [-Forward] [-MessageData <psobject>] [-SupportEvent] [<CommonParameters>]

描述

Register-ObjectEvent Cmdlet 會在本機電腦或遠端電腦上訂閱 .NET Framework 物件所產生的事件。

當引發訂閱的事件時,訂閱的事件會新增到工作階段中的事件佇列。若要取得事件佇列中的事件,請使用 Get-Event Cmdlet。

您可以使用 Register-ObjectEvent 的參數指定事件的屬性值,以協助您識別佇列中的事件。也可以使用 Action 參數指定當引發訂閱的事件時所要採取的動作,並使用 Forward 參數將遠端事件傳送到本機工作階段中的事件佇列。

訂閱事件時,事件訂閱者會新增到工作階段。若要取得工作階段中的事件訂閱者,請使用 Get-EventSubscriber Cmdlet。若要取消訂閱,請使用 Unregister-Event Cmdlet,它會從工作階段刪除事件訂閱者。

參數

-Action <scriptblock>

指定要處理事件的命令。當引發事件時會執行 Action 中的命令,而非將事件傳送到事件佇列。請以大括號 ( { } ) 括住命令以建立指令碼區塊。

Action 參數的值可以包含 $Event、$EventSubscriber、$Sender、$SourceEventArgs 和 $SourceArgs 自動變數,這些自動變數為 Action 指令碼區塊提供事件的相關資訊。如需詳細資訊,請參閱 about_Automatic_Variables。

指定動作時,Register-ObjectEvent 會傳回代表該動作的事件工件物件。您可以使用 Job Cmdlet 管理事件工作。

必要?

false

位置?

102

預設值

None.

接受管線輸入?

false

接受萬用字元?

false

-EventName <string>

指定所要訂閱的事件。請輸入事件名稱。此參數為必要項。

此參數的值不是您為事件訂閱所選取的名稱,而是 .NET Framework 物件所公開的事件名稱。例如,ManagementEventWatcher 類別有名稱為 "EventArrived" 和 "Stopped" 的事件。若要找出事件的事件名稱,請使用 Get-Member Cmdlet。

必要?

true

位置?

2

預設值

接受管線輸入?

false

接受萬用字元?

false

-Forward

將這個訂閱的事件傳送到遠端工作階段。當您在遠端電腦上或透過遠端工作階段註冊事件時,請使用此參數。

必要?

false

位置?

named

預設值

False

接受管線輸入?

false

接受萬用字元?

false

-InputObject <psobject>

指定產生事件的 .NET Framework 物件。請輸入包含物件的變數,或輸入可取得物件的命令或運算式。此參數為必要項。

必要?

true

位置?

1

預設值

接受管線輸入?

false

接受萬用字元?

false

-MessageData <psobject>

指定要與這個事件訂閱產生關聯的任何其他資料。此參數的值會出現在所有與這個訂閱關聯之事件的 MessageData 屬性中。

必要?

false

位置?

named

預設值

接受管線輸入?

false

接受萬用字元?

false

-SourceIdentifier <string>

指定您為訂閱所選取的名稱。您所選取的名稱在目前工作階段中必須是唯一的。預設值為 Windows PowerShell 指派的 GUID。

此參數的值會出現在用戶物件和所有與這個訂閱關聯之事件的 SourceIdentifier 屬性中。

必要?

false

位置?

101

預設值

GUID

接受管線輸入?

false

接受萬用字元?

false

-SupportEvent

隱藏事件訂閱。當目前的訂閱屬於較複雜的事件註冊機制,而且不可單獨進行探索時,請使用此參數。

若要檢視或取消以 SupportEvent 參數建立的訂閱,請使用 Get-EventSubscriberUnregister-Event Cmdlet 的 Force 參數。

必要?

false

位置?

named

預設值

False

接受管線輸入?

false

接受萬用字元?

false

<CommonParameters>

這個 Cmdlet 支援一般參數:-Verbose、-Debug、-ErrorAction、-ErrorVariable、-OutBuffer 和 -OutVariable。如需詳細資訊,請參閱 about_Commonparameters.

輸入和輸出

輸入型別是可經由管道輸出至 Cmdlet 的物件型別。傳回型別則是 Cmdlet 所傳回的物件型別。

輸入

您無法經由管道將物件輸出至 Register-ObjectEvent。

輸出

這個 Cmdlet 不會產生任何輸出。

附註

事件、事件訂閱和事件佇列只存在於目前的工作階段中。如果關閉目前的工作階段,則會捨棄事件佇列並取消事件訂閱。

範例 1

C:\PS>$query = New-Object System.Management.WqlEventQuery "__InstanceCreationEvent", (New-Object TimeSpan 0,0,1), "TargetInstance isa 'Win32_Process'" 

C:\PS> $processWatcher = New-Object System.Management.ManagementEventWatcher $query 

C:\PS> register-objectEvent -inputObject $processWatcher -eventName "EventArrived"

描述
-----------
這個範例會訂閱當新處理序啟動時產生的事件。

這個範例中的命令會使用 ManagementEventWatcher 物件取得 EventArrived 事件。查詢物件會指定事件是 Win32_Process 類別的執行個體建立事件。






範例 2

C:\PS>$query = New-Object System.Management.WqlEventQuery "__InstanceCreationEvent", (New-Object TimeSpan 0,0,1), "TargetInstance isa 'Win32_Process'" 

C:\PS> $processWatcher = New-Object System.Management.ManagementEventWatcher $query 

C:\PS> $action = { New-Event "PowerShell.ProcessCreated" -Sender $sender -EventArguments $SourceEventArgs.NewEvent.TargetInstance } 

C:\PS> register-objectEvent -inputObject $processWatcher -eventName "EventArrived" -action $action

Id    Name            State      HasMoreData     Location             Command
--    ----            -----      -----------     --------             -------
2     422cfe5a-65e... Running    True                                 New-Event "PowerShe...

描述
-----------
這個範例示範如何指定要回應事件的動作。指定動作時,所引發的事件不會新增至事件佇列。不過,該動作會回應事件。

在這個範例中,引發執行個體建立事件,表示新的處理啟動而引發新的 ProcessCreated 事件。

該動作會使用僅針對事件動作填入的 $Sender 和 $SourceEventArgs 自動變數。

Register-ObjectEvent 命令會傳回代表動作的工作物件,它會以背景工作的方式執行。您可以使用 Job Cmdlet (例如 Get-Job 和 Receive-Job) 管理背景工作。

如需詳細資訊,請參閱 about_Jobs。






範例 3

C:\PS>$s = new-pssession -computername Server01, Server02

C:\PS> invoke-command -session $s -filepath ProcessCreationEvent.ps1

C:\PS> invoke-command -session $s { get-event }

# ProcessCreationEvent.ps1

function Enable-ProcessCreationEvent 
{ 
   $query = New-Object System.Management.WqlEventQuery "__InstanceCreationEvent", ` 
       (New-Object TimeSpan 0,0,1), ` 
       "TargetInstance isa 'Win32_Process'" 
   $processWatcher = New-Object System.Management.ManagementEventWatcher $query 

   $identifier = "WMI.ProcessCreated" 
   Register-ObjectEvent -input $processWatcher -eventName "EventArrived" `
      -sourceIdentifier $identifier -messageData "Test" -forward 
   } 
} 

EnableProcessCreationEvent

描述
-----------
這個範例示範在遠端電腦上訂閱物件事件。

第一個命令會在兩台遠端電腦上建立 PSSessions,然後將它們儲存到 $s 變數。

第二個命令會使用 Invoke-Command Cmdlet 的 FilePath 參數,在 $s 的每個 PSSession 內執行 ProcessCreationEvent.ps1 指令碼。

此指令碼內含的 Register-ObjectEvent 命令會透過 ManagementEventWatcher 物件及其 EventArrived 事件,訂閱 Win32_Process 物件上的執行個體建立事件。






範例 4

C:\PS>$timer  = New-Object Timers.Timer

C:\PS> $timer.Interval = 500

C:\PS> $job = Register-ObjectEvent -inputObject $timer -eventName Elapsed -sourceIdentifier Timer.Random -Action {$random = Get-Random -Min 0 -Max 100}

C:\PS> $job.gettype().fullname
System.Management.Automation.PSEventJob

C:\PS> $job | format-list -property *

State         : Running
Module        : __DynamicModule_6b5cbe82-d634-41d1-ae5e-ad7fe8d57fe0
StatusMessage :
HasMoreData   : True
Location      :
Command       : $random = Get-Random -Min 0 -Max 100
JobStateInfo  : Running
Finished      : System.Threading.ManualResetEvent
InstanceId    : 88944290-133d-4b44-8752-f901bd8012e2
Id            : 1
Name          : Timer.Random
ChildJobs     : {}
...

C:\PS> $timer.Enabled = $true

C:\PS> & $job.module {$random}
60

C:\PS> & $job.module {$random}
47

描述
-----------
這個範例會示範如何將動態模組用於您在事件註冊中包含 Action 時所建立的 PSEventJob 物件中。

第一個命令會使用 New-Object Cmdlet 來建立計時器物件。第二個命令會將計時器的間隔設定為 500 (毫秒)。

第三個命令會使用 Register-ObjectEvent Cmdlet 來註冊計時器物件的 Elapsed 事件。該命令包含處理事件的動作。每當經過計時器間隔時,就會引發事件並且執行動作中的命令。在這個範例中,Get-Random Cmdlet 會產生介於 0 與 100 之間的亂數並將它儲存在 $random 變數中。

當您在 Register-ObjectEvent 命令中使用 Action 參數時,該命令就會傳回代表動作的 PSEventJob 物件,再將工作物件儲存在 $job 變數中。

Register-ObjectEvent Cmdlet 所傳回的 PSEventJob 物件也可以用於事件訂閱者的 Action 屬性中。如需詳細資訊,請參閱 Get-EventSubscriber。

第四個命令會顯示 $job 變數包含 PSEventJob 物件。第五個命令會使用 Format-List Cmdlet,以清單顯示 PSEventJob 物件的所有屬性。

PSEventJob 具有 Module 屬性,其中包含實作動作的動態指令碼模組。

第六個命令會啟用計時器。

其他命令則使用呼叫運算子 (&) 來叫用模組中的命令並且顯示 $random 變數的值。您可以使用呼叫運算子來叫用模組中的任何命令,包括尚未匯出的命令。在這個範例中,這些命令會顯示發生 Elapsed 事件時所產生的亂數。

如需模組的詳細資訊,請參閱 about_Modules。






請參閱




目錄