Con garbo arresto in PowerShell
-
19-09-2019 - |
Domanda
Come faccio a cattura e gestire Ctrl + C in uno script PowerShell? Capisco che posso fare questo da un cmdlet in v2 includendo un override per il metodo Powershell.Stop()
, ma non riesco a trovare un analogo per l'uso negli script.
Al momento sto eseguendo cleanup tramite un blocco end
, ma ho bisogno di svolgere un lavoro supplementare quando lo script viene annullato (al contrario di correre fino al completamento).
Soluzione
È possibile utilizzare il metodo descritto in qui sulla PoshCode
Sommario:
Set
[console]::TreatControlCAsInput = $true
quindi il polling per l'input dell'utente utilizzando
if($Host.UI.RawUI.KeyAvailable -and (3 -eq
[int]$Host.UI.RawUI.ReadKey("AllowCtrlC,IncludeKeyUp,NoEcho").Character))
Altri suggerimenti
Il documentazione per try-catch-finally dice:
Un Infine blocco viene eseguito anche se si utilizza CTRL + C per fermare lo script. A fine blocco gestisce anche se una parola chiave Exit interrompe lo script all'interno di un fermo blocco.
Si veda il seguente esempio. Eseguire e cancellarlo premendo ctrl-c
.
try
{
while($true)
{
"Working.."
Start-Sleep -Seconds 1
}
}
finally
{
write-host "Ended work."
}
C'è anche una proprietà Stopping
su $PSCmdlet
che può essere usato per questo.