订阅由 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-EventSubscriberUnregister-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。






另请参阅




目录