2012-04-16 14 views
9

Czy to możliwe? W końcu zdecydowałem się rozpocząć konfigurowanie mojego osobistego środowiska programistycznego .NET, aby bliżej naśladować, jak skonfigurować środowisko programistyczne * NIX, co oznacza uczenie się Powershell na serio.Jak przechwytywać sygnały w programie PowerShell?

Obecnie piszę funkcję, która powtarza się przez system plików, ustawiając katalog roboczy w celu tworzenia rzeczy. Jedną z małych rzeczy, która mi przeszkadza, jest to, że jeśli Ctrl + C z funkcji, pozostawia mnie tam, gdzie jest ostatni scenariusz. Próbowałem ustawić blok trap, który zmienia katalog do punktu początkowego po uruchomieniu, ale wydaje się, że jest to przeznaczone (i ognia) na wyjątek.

Jeśli był to język, który miał root w Uniksie, skonfigurowałbym obsługę sygnału dla SIGINT, ale nie mogę znaleźć niczego podobnego, szukając w Powershell. Zakładając czapkę .NET, wyobrażam sobie, że jest jakieś wydarzenie, do którego mogę dołączyć opiekuna, a jeśli miałbym zgadywać, byłoby to zdarzenie $host, ale nie mogę znaleźć żadnej dokumentacji kanonicznej dla System.Management.Automation.Internal.Host.InternalHostUserInterface i nic anegdotycznego, co udało mi się wyszukać, okazało się pomocne.

Być może brakuje mi czegoś całkowicie oczywistego?

Odpowiedz

16

Masz na myśli coś takiego?

try 
{ 
    Push-Location 
    Set-Location "blah" 
    # Do some stuff here 
} 

finally 
{ 
    Pop-Location 
} 

Patrz dokumentacja here. Szczególnie, że ust. "bloku finally wypowiedzi działać niezależnie od tego, czy blok Try napotka błąd obciążeniowy Windows PowerShell uruchamia wreszcie blokować przed skrypt kończy lub przed aktualny blok wychodzi blok A kończy się, nawet jeśli do zatrzymania skryptu używa się klawiszy CTRL + C. Blok finally działa również, jeśli słowo kluczowe Exit powoduje zatrzymanie skryptu z poziomu bloku catch. "

+2

Wreszcie prosta rozwiązanie oczyścić CTRL-C (zakończone zadanie: – Callahan

5

Obsługuje wejście konsoli do konsoli. Jeśli wciśnięty zostanie przycisk C podczas pętli, będziesz miał szansę obsłużyć to wydarzenie, jak tylko chcesz. W przykładowym kodzie drukowane jest ostrzeżenie i następuje wyjście z pętli.

[console]::TreatControlCAsInput = $true 
dir -Recurse -Path C:\ | % { 
    # Process file system object here... 
    Write-Host $_.FullName 

    # Check if ctrl+C was pressed and quit if so. 
    if ([console]::KeyAvailable) { 
     $key = [system.console]::readkey($true) 
     if (($key.modifiers -band [consolemodifiers]"control") -and ($key.key -eq "C")) { 
      Write-Warning "Quitting, user pressed control C..." 
      break 
     } 
    } 
+0

Nie działa z ISE, ale doskonały w normalnym oknie PowerShell – Froosh

Powiązane problemy