Tabla de contenido
evento de registro de powershell
1. Preguntas planteadas
La consola se usa Ctrl-C
como un botón de cancelación, que aparece en Console.CancelKeyPress
forma de C. A veces queremos darnos cuenta de que presionamos Ctrl-C
salir en un bucle asíncrono y trabajar en la destrucción de variables al salir. CancelKeyPress
La 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
- Bloque de secuencias de comandos: Bloque de secuencias de comandos
- Cancelar evento: Console.CancelKeyPress
- Registrar eventos: Register-ObjectEvent , Register-EngineEvent
- Propiedad de finalización de argumento: ArgumnetCompleter
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 -InputObject
el 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