2009-11-10 10 views
21

Jak złapać i obsłużyć Ctrl + C w skrypcie PowerShell? Rozumiem, że mogę to zrobić z cmdletu w v2, włączając zastąpienie dla metody Powershell.Stop(), ale nie mogę znaleźć analogu do użycia w skryptach.Z wdziękiem zatrzymuje się w Powershell

Obecnie przeprowadzam czyszczenie via an end block, ale muszę wykonać dodatkową pracę, gdy skrypt zostanie anulowany (w przeciwieństwie do uruchamiania do zakończenia).

Odpowiedz

5

Można zastosować metodę opisaną na here on PoshCode

Podsumowanie:

Set

[console]::TreatControlCAsInput = $true 

następnie sondować dla danych wejściowych użytkownika z wykorzystaniem

if($Host.UI.RawUI.KeyAvailable -and (3 -eq 
    [int]$Host.UI.RawUI.ReadKey("AllowCtrlC,IncludeKeyUp,NoEcho").Character)) 
+0

Wow, to szalone. Skończyłem właśnie na przepisywaniu mojego skryptu jako cmdlet w C#, więc mogłem zastąpić Stop(). –

30

The documentation na try-catch- w końcu mówi:

A Blok kończy się, nawet jeśli używasz CTRL + C, aby zatrzymać skrypt. Końcowy blok jest również uruchamiany, jeśli słowo kluczowe wyjście spowoduje zatrzymanie skryptu w bloku Catch .

Zobacz następujący przykład. Uruchom go i anuluj, naciskając ctrl-c.

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

To prawda, ale w końcu będzie działać nie tylko dlatego, że wywołano Exit, ale także, jeśli blok Trya się powiedzie. Jak wskazałem w moim pytaniu, muszę wykonać dodatkową pracę, gdy skrypt zostanie anulowany (w przeciwieństwie do uruchomienia do zakończenia). –

+5

@ fatcat111 użyj flagi typu Boolean. Na przykład ustaw '$ didcomplete = $ true' na końcu' try' i sprawdź za pomocą 'if ($ didcomplete) {Write-Host" Zakończona praca. " } 'wewnątrz' finally' –

+0

Niestety, blok finally nie jest wykonywany, jeśli okno konsoli PowerShell jest zamknięte. –

1

Istnieje również Stopping nieruchomość na $PSCmdlet, które mogą być wykorzystywane do tego celu.

+0

'Zatrzymywanie' jest' fałszem' nawet po zatrzymaniu na [PowerShell/PowerShell # 6322] (https://github.com/PowerShell/PowerShell/issues/6322). – alx9r

Powiązane problemy