Con gracia parando en Powershell
-
19-09-2019 - |
Pregunta
¿Cómo capturar y manejar Ctrl + C en un script de PowerShell? Yo entiendo que yo puedo hacer esto desde un cmdlet en la versión 2 mediante la inclusión de un reemplazo para el método Powershell.Stop()
, pero no puedo encontrar un análogo para su uso en scripts.
Actualmente estoy realizando la limpieza a través de un bloque de end
, pero necesito realizar un trabajo adicional cuando se cancela la secuencia de comandos (en contraposición a ejecutarse hasta su finalización).
Solución
Se puede usar el método descrito en aquí en PoshCode
Resumen:
Set
[console]::TreatControlCAsInput = $true
a continuación sondear para la entrada del usuario utilizando
if($Host.UI.RawUI.KeyAvailable -and (3 -eq
[int]$Host.UI.RawUI.ReadKey("AllowCtrlC,IncludeKeyUp,NoEcho").Character))
Otros consejos
El documentación de try-catch-finally dice:
Un último bloque se ejecuta incluso si se utiliza CTRL + C para detener el script. Un último bloque también se ejecuta si una palabra clave de la salida se detiene la secuencia de comandos desde el interior de un Catch bloque.
Véase el siguiente ejemplo. Ejecutarlo y cancelarlo pulsando ctrl-c
.
try
{
while($true)
{
"Working.."
Start-Sleep -Seconds 1
}
}
finally
{
write-host "Ended work."
}
También hay una propiedad Stopping
en $PSCmdlet
que se puede utilizar para esto.