【pwsh】注册Event与EvnetHandler对象,以Ctrl-C事件为例

powershell 注册事件

一、问题提出

控制台把Ctrl-C作为取消按键,在C#中以Console.CancelKeyPress形式出现,有时候我们会想实现在异步循环中按Ctrl-C退出,并在退出时做一些销毁变量的工作。按CancelKeyPress类型推断,需要通过绑定委托的形式来实现。
C#中事件使用委托(delegate)来注册绑定,powershell里委托使用scriptblock类来编写,那么怎么把写好的脚本块绑定到指定的对象、类之中呢?

二、内容涉及

三、代码样例

Register-ObjectEvent `
    -InputObject ([Console]) `
    -EventName "CancelKeyPress"`
    -SourceIdentifier "ConsoleCancelEventHandler"`
    -Action { Write-Host "Press cancel key: Ctrl-C" }

下面的脚本使用参数补全,指定好-InputObject的值后按Tab即可快速填充事件名与事件类型

<#
.Synopsis
    事件注册模板,以 Ctrl-C 事件为例
#>
[CmdletBinding()]
param (
    [Parameter()]
    [System.Object]
    $InputObject,

    [Parameter(Mandatory)]
    [ArgumentCompleter( {
            [OutputType([System.Management.Automation.CompletionResult])]
            param(
                [string] $CommandName,
                [string] $ParameterName,
                [string] $WordToComplete,
                [Management.Automation.Language.CommandAst] $CommandAst,
                [Collections.IDictionary] $FakeBoundParameters
            )
            $inputobj = $FakeBoundParameters["InputObject"]
            $(
                if ($inputobj -is [Type]) { $inputobj.GetEvents() }
                else { $InputObject | Get-Member -MemberType Event }
            ).Name | Where-Object { $_ -like "$WordToComplete*" }
        })]
    [string]
    $EventName,

    [Parameter()]
    [ArgumentCompleter( {
            [OutputType([System.Management.Automation.CompletionResult])]
            param(
                [string] $CommandName,
                [string] $ParameterName,
                [string] $WordToComplete,
                [Management.Automation.Language.CommandAst] $CommandAst,
                [Collections.IDictionary] $FakeBoundParameters
            )
            $_ = $FakeBoundParameters["InputObject"]
            $(
                if ($_ -is [Type]) { $_.GetEvents().EventHandlerType }
                else { ($_ | Get-Member -MemberType Event).TypeName }
            ) | Where-Object { $_ -like "$WordToComplete*" }
        })]
    [string]
    $SourceIdentifier,

    [Parameter(Mandatory)]
    [scriptblock]
    $Action
)

Register-ObjectEvent @PSBoundParameters

四、其他参考

  1. powershell与event
  2. powershell如何修改控制台退出事件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值