订阅由 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,该 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-EventSubscriber 和 Unregister-Event cmdlet 的 Force 参数。
是否为必需? |
false |
位置? |
named |
默认值 |
False |
是否接受管道输入? |
false |
是否接受通配符? |
false |
<CommonParameters>
此 cmdlet 支持通用参数:-Verbose、-Debug、-ErrorAction、-ErrorVariable、-OutBuffer 和 -OutVariable。有关详细信息,请参阅 about_Commonparameters.
输入和输出
输入类型是指可通过管道传递给 cmdlet 的对象的类型。返回类型是指 Cmdlet 所返回对象的类型。
输入 |
None 不能通过管道将对象传递给 Register-ObjectEvent。 |
输出 |
None 此 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 说明 ----------- 此示例演示了如何订阅远程计算机上的对象事件。 第一个命令在两台远程计算机上创建 PSSession 并将它们保存在 $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。
另请参阅