2009-11-10 11 views
21

¿Cómo atrapo y manejo Ctrl + C en un script de PowerShell? Entiendo que puedo hacer esto desde un cmdlet en v2 incluyendo una anulación para el método Powershell.Stop(), pero no puedo encontrar un análogo para su uso en scripts.deteniéndose con agrado en Powershell

Actualmente estoy realizando la limpieza via an end block, pero tengo que realizar un trabajo adicional cuando se cancela la secuencia de comandos (en lugar de ejecutar hasta la finalización).

Respuesta

5

Se puede usar el método descrito en here on PoshCode

Resumen:

Conjunto

[console]::TreatControlCAsInput = $true 

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)) 
+0

Guau, eso es una locura. Terminé reescribiendo mi script como un cmdlet en C# para poder anular Stop(). –

30

El documentation para la prueba Catch finalmente dice:

A Finalmente se ejecuta el bloque incluso si usa CTRL + C para detener el script. Por último, se ejecuta un bloque si una palabra clave Exit detiene el script desde un bloque Catch .

Vea el siguiente ejemplo. Ejecútelo y cancélelo presionando ctrl-c.

try 
{ 
    while($true) 
    { 
     "Working.." 
     Start-Sleep -Seconds 1 
    } 
} 
finally 
{ 
    write-host "Ended work." 
} 
+0

Esto es cierto, pero finalmente se ejecutará no solo porque se llamó a Exit, sino también si el bloque Try tiene éxito. Como indiqué en mi pregunta, debo realizar un trabajo adicional cuando se cancela el guión (en lugar de ejecutarlo hasta su finalización). –

+5

@ fatcat111 usa una bandera booleana. Por ejemplo, configure '$ didcomplete = $ true' al final de su' try' y verifique con 'if ($ didcomplete) {Write-Host" Finalizó el trabajo. " } 'dentro del' finally' –

+0

Desafortunadamente, el bloque finally no se ejecuta si la ventana de la consola PowerShell está cerrada. –

1

También hay un Stopping propiedad en $PSCmdlet que se puede utilizar para esto.

+0

'Detener' es' falso' incluso cuando se detiene por [PowerShell/PowerShell # 6322] (https://github.com/PowerShell/PowerShell/issues/6322). – alx9r