[pwsh] Registro de eventos y objetos EvnetHandler, tome el evento Ctrl-C como ejemplo

evento de registro de powershell

1. Preguntas planteadas

La consola se usa Ctrl-Ccomo un botón de cancelación, que aparece en Console.CancelKeyPressforma de C. A veces queremos darnos cuenta de que presionamos Ctrl-Csalir en un bucle asíncrono y trabajar en la destrucción de variables al salir. CancelKeyPressLa inferencia de tipos debe implementarse en forma de delegados vinculantes .
Los eventos en C# usan la delegación ( delegate) para registrarse y enlazar, y la delegación en powershellscriptblock usa clases para escribir, entonces, ¿cómo enlazar el bloque de script escrito al objeto o clase especificado?

Dos, el contenido implica

3. Ejemplo de código

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

La siguiente secuencia de comandos utiliza la finalización de parámetros. Después de especificar -InputObjectel valor, presione Tabulador para completar rápidamente el nombre y el tipo de evento.

<#
.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

4. Otras referencias

  1. evento powershell
  2. Cómo PowerShell modifica el evento de salida de la consola

Supongo que te gusta

Origin blog.csdn.net/qq_41755979/article/details/106604246
Recomendado
Clasificación