Register-EngineEvent

订阅 PowerShell 引擎和 New-Event cmdlet 生成的事件。

语法

Default (默认值)

Register-EngineEvent
    [-SourceIdentifier] <String>
    [[-Action] <ScriptBlock>]
    [-MessageData <PSObject>]
    [-SupportEvent]
    [-Forward]
    [-MaxTriggerCount <Int32>]
    [<CommonParameters>]

说明

Register-EngineEvent cmdlet 订阅 PowerShell 引擎和 New-Event cmdlet 生成的事件。 使用 SourceIdentifier 参数指定事件。

可以使用此 cmdlet 订阅 OnIdle 或 Exiting 引擎事件和由 New-Event cmdlet 生成的事件。 这些事件会自动添加到会话中的事件队列,而无需订阅。 但是,订阅允许转发事件、指定响应事件的操作以及取消订阅。

当您订阅一个事件时,一个事件订阅者将被添加到您的当前会话中。 若要获取会话中的事件订阅者,请使用 Get-EventSubscriber cmdlet。 若要取消订阅,请使用 Unregister-Event cmdlet,从会话中删除事件订阅者。

当引发已订阅的事件时,它将添加到你的会话中的事件队列。 若要获取事件队列中的事件,请使用 Get-Event cmdlet。

示例

示例 1:在远程计算机上注册 PowerShell 引擎事件

此示例在两台远程计算机上注册 PowerShell 引擎事件。

$S = New-PSSession -ComputerName "Server01, Server02"
Invoke-Command -Session $S {
  Register-EngineEvent -SourceIdentifier ([System.Management.Automation.PSEngineEvent]::Exiting) -Forward
}

New-PSSession 在每个远程计算机上创建用户管理的会话(PSSession)。Invoke-Command cmdlet 在远程会话中运行 Register-EngineEvent 命令。 Register-EngineEvent 使用 SourceIdentifier 参数来标识事件。 Forward 参数告知引擎将事件从远程会话转发到本地会话。

示例 2:发生退出事件时执行指定的操作

此示例演示如何在发生 Register-EngineEvent 事件时运行 以执行特定操作。

Register-EngineEvent -SourceIdentifier PowerShell.Exiting -SupportEvent -Action {
    Get-History | Export-Clixml $HOME\history.clixml
}

添加了 SupportEvent 参数以隐藏事件订阅。 PowerShell 退出时,在这种情况下,退出会话中的命令历史记录将导出用户 $HOME 目录中的 XML 文件。

示例 3:创建和订阅用户定义的事件

此示例用于为源 MyEventSource的事件创建一个订阅。 这是一个我们将用于监控工作进度的随机来源。 Register-EngineEvent 用于创建订阅。 Action 参数的脚本块将事件数据记录到文本文件中。

Register-EngineEvent -SourceIdentifier MyEventSource -Action {
    "Event: {0}" -f $Event.MessageData | Out-File C:\temp\MyEvents.txt -Append
}

Start-Job -Name TestJob -ScriptBlock {
    while ($true) {
        Register-EngineEvent -SourceIdentifier MyEventSource -Forward
        Start-Sleep -Seconds 2
        "Doing some work..."
        $newEventSplat = @{
            SourceIdentifier = 'MyEventSource'
            MessageData      = ("{0} -  Work done..." -f (Get-Date))
        }
        New-Event @newEventSplat
    }
}
Start-Sleep -Seconds 4
Get-EventSubscriber
Get-Job
SubscriptionId   : 12
SourceObject     :
EventName        :
SourceIdentifier : MyEventSource
Action           : System.Management.Automation.PSEventJob
HandlerDelegate  :
SupportEvent     : False
ForwardEvent     : False

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
18     MyEventSource                   Running       True                                 …
19     TestJob         BackgroundJob   Running       True            localhost            …

Register-EngineEvent 创建了作业 ID 18。 Start-Job 已创建作业 ID 为 19。 在示例 #4 中,我们删除事件订阅和作业,然后检查日志文件。

示例 4:注销事件并清理作业

这是示例 3 的延续。 在此示例中,我们等待 10 秒,让多个事件发生。 然后,我们注销事件订阅。

PS> Start-Sleep -Seconds 10
PS> Get-EventSubscriber | Unregister-Event
PS> Get-Job

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
18     MyEventSource                   Stopped       False                                …
19     TestJob         BackgroundJob   Running       True            localhost            …

PS> Stop-Job -Id 19
PS> Get-Job | Remove-Job
PS> Get-Content C:\temp\MyEvents.txt
Event: 2/18/2020 2:36:19 PM -  Work done...
Event: 2/18/2020 2:36:21 PM -  Work done...
Event: 2/18/2020 2:36:23 PM -  Work done...
Event: 2/18/2020 2:36:25 PM -  Work done...
Event: 2/18/2020 2:36:27 PM -  Work done...
Event: 2/18/2020 2:36:29 PM -  Work done...
Event: 2/18/2020 2:36:31 PM -  Work done...

Unregister-Event cmdlet 将停止与事件订阅关联的作业(作业 ID 18)。 作业 ID 19 仍在运行并创建新事件。 我们使用 作业 命令行小程序来停止作业并删除不需要的作业对象。 Get-Content 显示日志文件的内容。

参数

-Action

指定用于处理事件的命令。 Action 中的命令在引发事件时运行,而不是将事件发送到事件队列。 将命令括在大括号({})中以创建脚本块。

Action 参数的值可以包括 $Event$EventSubscriber$Sender$EventArgs$args 自动变量,这些变量向 操作 脚本块提供有关事件的信息。 有关详细信息,请参阅 about_Automatic_Variables

指定操作时,Register-EngineEvent 返回表示该操作的事件作业对象。 你可以使用 Job cmdlet 来管理事件作业。

参数属性

类型:ScriptBlock
默认值:None
支持通配符:False
不显示:False

参数集

(All)
Position:101
必需:False
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

-Forward

指示该 cmdlet 将此订阅的事件发送到本地计算机上的会话。 在远程计算机或远程会话中注册事件时,请使用此参数。

参数属性

类型:SwitchParameter
默认值:None
支持通配符:False
不显示:False

参数集

(All)
Position:Named
必需:False
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

-MaxTriggerCount

指定事件订阅中操作执行的最大次数。

参数属性

类型:Int32
默认值:None
支持通配符:False
不显示:False

参数集

(All)
Position:Named
必需:False
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

-MessageData

此参数是所有事件 cmdlet 的基类的一部分。 Register-EngineEvent 不使用此参数。 忽略传递给此参数的任何数据。

参数属性

类型:PSObject
默认值:None
支持通配符:False
不显示:False

参数集

(All)
Position:Named
必需:False
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

-SourceIdentifier

指定要订阅的事件的源标识符。 源标识符在当前会话中必须是唯一的。 此参数是必需的。

此参数的值显示在订阅服务器对象的 SourceIdentifier 属性和与此订阅关联的所有事件对象的值中。

该值特定于事件的源。 这可以是你创建的任意值,用来与 New-Event cmdlet 一起使用。 PowerShell 引擎支持 PSEngineEvent 值 PowerShell.Exiting 和 PowerShell.OnIdle。

参数属性

类型:String
默认值:None
支持通配符:False
不显示:False

参数集

(All)
Position:100
必需:True
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

-SupportEvent

指示该 cmdlet 隐藏事件订阅。 当当前订阅是更复杂的事件注册机制的一部分并且不应独立发现时添加此参数。

若要查看或取消使用 SupportEvent 参数创建的订阅,请将 Force 参数添加到 Get-EventSubscriberUnregister-Event cmdlet。

参数属性

类型:SwitchParameter
默认值:None
支持通配符:False
不显示:False

参数集

(All)
Position:Named
必需:False
来自管道的值:False
来自管道的值(按属性名称):False
来自剩余参数的值:False

CommonParameters

此 cmdlet 支持通用参数:-Debug、-ErrorAction、-ErrorVariable、-InformationAction、-InformationVariable、-OutBuffer、-OutVariable、-PipelineVariable、-ProgressAction、-Verbose、-WarningAction 和 -WarningVariable。 有关详细信息,请参阅 about_CommonParameters

输入

None

不能用管道将对象传送到此 cmdlet。

输出

None

默认情况下,此 cmdlet 不返回任何输出。

PSEventJob

使用 Action 参数时,此 cmdlet 将返回 PSEventJob 对象。

备注

事件、事件订阅和事件队列仅存在于当前会话中。 如果关闭当前会话,事件队列将被丢弃,事件订阅也将被取消。

订阅 Exiting 事件时,Action 参数可执行的 cmdlet 仅限于 Microsoft.PowerShell.Core 和 Microsoft.PowerShell.Utility 模块中的 cmdlet。 仅当会话在 PowerShell 的控制下退出会话时,才会触发 Exiting 事件。 当主机应用程序或终端窗口关闭时,不会触发该事件。

如果引擎未运行管道,则被视为处于空闲状态。 当 PowerShell 空闲达到 300 毫秒 (ms) 时,将触发 OnIdle 事件。

注释

当正在使用 PSReadLine 时,OnIdle 事件会在 ReadKey() 超时(300 毫秒内无键入)时触发。 当用户处于编辑命令行的中间时,可能会发出该事件信号,例如,用户正在阅读帮助来确定要使用的参数。 从 PSReadLine 2.2.0-beta4 开始,OnIdle 行为更改为仅当存在 超时且当前编辑缓冲区为空时,事件才会发出信号。ReadKey()