1.PowerShell事件处理通常有三个步骤:发布事件、订阅事件、处理事件
2.PowerShell事件相关的命令有:
- Register-ObjectEvent
- Register-EngineEvent
- Register-WmiEvent
- Register-CimIndicationEvent
- Unregister-Event
- Get-Event
- New-Event
- Remove-Event
- Wait-Event
- Get-EventSubscriber
【1】通过Net-Event发布事件,此命令发布的事件都是EngineEvent,可通过Register-EngineEvent命令来订阅,相关要发送给处理程序的参数可在此命令中指定
【2】前面四个以Register开始,以Event结束的命令都是用来订阅事件的命令,第五个是用来取消订阅的命令
【3】可以通过Get-EventSubscriber来获取已经建立的事件订阅者对象,就是Register-*Event被执行后返回的对象
【4】如果订阅事件时,没有指定Action参数,那么当被订阅的事件被触发时,事件信息会作为一个对象存入PowerShell事件队列,你可以通过Get-Event命令获取特定的事件的事件信息对象,也可以通过Remove-Event命令来从事件队列中移除事件对象,你也可以通过Wait-Event命令来等待某种事件的发生,此时脚本会阻塞挂起
【5】如果订阅事件时,指定了Action参数,那么事件被触发后,事件信息会以一系列自动变量,打包给Action参数指定的ScriptBlock,该ScriptBlock可以有返回值,也可以没有,你可以通过该订阅命令返回的订阅对象(比如$es)来访问,该ScriptBlock的返回值:$es.Action.Output,即包含该ScriptBlock的所有返回值
【6】EngineEvent除了内置的三种事件源,就是来自用户通过New-Event自定义的事件了,除了这些你自定义的事件外,其它三种事件源集合的事件的触发都不是你能决定的,你只能订阅它们,处理它们
3.事件对象,是处理事件的基础,在真正处理事件之前,你必须熟知这种对象
以下是一个事件对象的示例
以下是事件对象的帮助信息:
Get-Event cmdlet 返回具有以下属性的 PSEventArgs 对象 (System.Management.Automation.PSEventArgs)。
-- ComputerName:发生该事件的计算机的名称。只有在从远程计算机转发该事件时,才填充此属性值。
-- RunspaceId:一个 GUID,用于唯一标识该事件发生时所在的会话。只有在从远程计算机转发该事件时,才填充此属性值。
-- EventIdentifier:一个整数 (Int32),用于唯一标识当前会话中的事件通知。
-- Sender:生成事件的对象。在 Action 参数的值中,$Sender 自动变量包含发送方对象。
-- SourceEventArgs:从 EventArgs 派生的第一个参数(如果存在)。例如,在签名形式为“Object sender, Timers.ElapsedEventArgs e”的
Timer Elapsed 事件中,SourceEventArgs 属性包含 Timers.ElapsedEventArgs。在 Action 参数的值中,$EventArgs 自动变量包含此值。
[原2.0版本帮助有误,其指明是$SourceEventArgs,而5.0帮助中指明是$EventArgs包含此值,亦或是后发版本有所修改]
-- SourceArgs:原始事件签名的所有参数。对于标准事件签名,$Args[0] 表示发送方,$Args[1] 表示 SourceEventArgs。在 Action 参数的值中,
$Args 自动变量包含此值。[原2.0版本的帮助文件中有误,5.0版本指定是$Args,亦或是后发版本的修改所致]
-- SourceIdentifier:用于标识事件订阅的字符串。在 Action 参数的值中,$Event 自动变量的 SourceIdentifier 属性包含此值。
-- TimeGenerated:一个 DateTime 对象,表示事件的生成时间。在 Action 参数的值中,$Event 自动变量的 TimeGenerated 属性包含此值。
-- MessageData:与事件订阅关联的数据。用户在注册事件时指定此数据。在 Action 参数的值中,$Event 自动变量的 MessageData 属性包含此值。
总结如下:
[1]Action中可用自动变量为:$Event/$Sender/$EventArgs/$Args
[2]由$Event自动变量,可获取ComputerName/RunspaceId/EventIdentifier/Sender/SourceEventArgs/SourceIdentifier/TimeGenerated/MessageData
[3]虽然$Event自动变量对象拥有SourceArgs属性,但是无法通过$Event.SourceArgs来访问,请使用$Args自动变量来访问该属性
[4]$Sender和$Event.Sender都是可用的访问途径