Szukałem sposobu na zakończenie skryptu PowerShell (PS1), gdy wystąpi niemożliwy do naprawienia błąd w funkcji. Na przykład:
function foo() {
# Do stuff that causes an error
$host.Exit()
}
Oczywiście nie ma czegoś takiego jak $host.Exit()
. Jest $host.SetShouldExit()
, ale tak naprawdę zamyka okno konsoli, czego nie chcę. Potrzebuję czegoś równoważnego do Pythona, sys.exit()
które po prostu zatrzyma wykonanie bieżącego skryptu bez dalszego adieu.
Edycja: Tak, to tylko exit
. Duh.
powershell
kprobst
źródło
źródło
Odpowiedzi:
Należy użyć do
exit
słowa kluczowego .źródło
Zdaję sobie sprawę, że to stary post, ale często wracam do tego wątku, ponieważ jest to jeden z najlepszych wyników wyszukiwania podczas wyszukiwania tego tematu. Jednak zawsze zostaję bardziej zdezorientowany niż wtedy, gdy przybyłem z powodu sprzecznych informacji. Ostatecznie zawsze muszę przeprowadzić własne testy, aby to rozgryźć. Więc tym razem opublikuję swoje wyniki.
TL; DR Większość osób będzie chciała użyć
Exit
do zakończenia uruchomionych skryptów. Jeśli jednak twój skrypt jedynie deklaruje funkcje do późniejszego użycia w powłoce, będziesz chciał użyć ichReturn
w definicjach tych funkcji.Wyjście vs powrót vs przerwa
Wyjdź: spowoduje to „wyjście” z aktualnie uruchomionego kontekstu. Wywołanie tego polecenia ze skryptu spowoduje jego zamknięcie. Jeśli wywołasz to polecenie z powłoki, opuści powłokę.
Jeśli funkcja wywoła polecenie Exit, wyjdzie z dowolnego kontekstu, w którym działa. Jeśli więc funkcja ta zostanie wywołana tylko z działającego skryptu, zakończy działanie tego skryptu. Jeśli jednak skrypt po prostu deklaruje funkcję, aby można jej było użyć z bieżącej powłoki, a ty uruchomisz tę funkcję z powłoki, opuści powłokę, ponieważ powłoka jest kontekstem, w którym działa funkcja obsługująca
Exit
polecenie.Uwaga: Domyślnie, jeśli klikniesz skrypt prawym przyciskiem myszy, aby uruchomić go w programie PowerShell, po zakończeniu działania skryptu program PowerShell zamknie się automatycznie. Nie ma to nic wspólnego z
Exit
poleceniem ani czymkolwiek innym w twoim skrypcie. Jest to tylko domyślne zachowanie programu PowerShell dla skryptów uruchamianych przy użyciu tej konkretnej metody uruchamiania skryptu. To samo dotyczy plików wsadowych i okna wiersza poleceń.Powrót: Powróci do poprzedniego punktu wywoławczego. Jeśli wywołasz to polecenie ze skryptu (poza funkcjami), powróci ono do powłoki. Jeśli wywołasz to polecenie z powłoki, powróci ono do powłoki (która jest poprzednim punktem wywoławczym dla pojedynczego polecenia uruchamianego z powłoki). Wywołanie tego polecenia z funkcji spowoduje powrót do miejsca, z którego funkcja została wywołana.
Wykonanie wszelkich poleceń po punkcie połączenia, do którego jest zwracany, będzie kontynuowane od tego miejsca. Jeśli skrypt jest wywoływany z powłoki i zawiera
Return
polecenie poza funkcjami, to po powrocie do powłoki nie ma więcej poleceń do uruchomienia, dzięki czemuReturn
używany jest w ten sam sposób jakExit
.Przerwa: spowoduje to wyrwanie się z pętli i zmianę przypadków. Wywołanie tego polecenia, gdy nie jest ono w pętli lub zmieniono wielkość liter, spowoduje wyrwanie się ze skryptu. Jeśli wywołujesz
Break
wewnątrz pętli zagnieżdżonej w pętli, wyłamie się ona tylko z pętli, w której została wywołana.Istnieje również interesująca funkcja
Break
której można poprzedzić pętlę etykietą, a następnie wyjść z tej pętli z etykietą, nawet jeśliBreak
polecenie jest wywoływane w kilku zagnieżdżonych grupach w tej pętli z etykietą.źródło
Exit
można przyjąć kod powrotu jako parametr (domyślnie 0) - npExit 3
.Get-Command Exit
iGet-Alias Exit
bez rezultatów. Następnie sprawdziłem, czy jest to słowo kluczowe, i nie znalazłem na nim oficjalnej dokumentacji. Patrząc na to teraz, nie wiem jednak, jak doszedłem do tego wniosku. Oczywiście jest to słowo kluczowe ( technet.microsoft.com/en-us/library/hh847744.aspx ). Być może dlatego, że Exit jest jednym z niewielu słów kluczowych, które nie mają własnego tematu about_ help, dlatego też lista tematów na lewym pasku bocznym go nie zawierała.Exit
zamknie również PowerShell. Jeśli chcesz „zerwać” z bieżącej funkcji lub skryptu - użyjBreak
:)źródło
break
jeśli chcesz po prostu wyjść z bieżącej funkcji ... skrypty wywoływania również mogą zostać zakłócone!Błąd zapisu dotyczy błędów nie kończących się, a błąd rzucania błędów
źródło
powershell -command "& module-function ..."
. Musiałem przekonwertować te funkcje, aby rzucić do owijającego try-catch i wyjść z tego owijającego catch, aby faktycznie wyprowadzić kod wyjścia błędu.$PSCmdlet.ThrowTerminatingError()
o przypadkach, gdy rzut nie może wykonać zadania (znany problem bez błędów kończących odthrow
)Kończy ten proces i nadaje bazowemu systemowi operacyjnemu określony kod wyjścia.
https://msdn.microsoft.com/en-us/library/system.environment.exit%28v=vs.110%29.aspx
[Environment]::Exit(1)
Umożliwi to wyjście z określonym kodem wyjścia, który można odebrać od dzwoniącego.
źródło
Exit 1
.[Environment]::Exit(1)
ma efekt uboczny wychodzenia z mojego okna PowerShell, gdy wywołuję go w skrypcie, ponieważ używanieexit
go nie wydaje się robić.Myślę, że
Return
zamiast tego szukaszBreak
. Przerwa jest zwykle używana w przypadku pętli i przerywa tylko od najbardziej wewnętrznego bloku kodu. Użyj Return, aby wyjść z funkcji lub skryptu.źródło
Return
po prostu powróci z funkcji, a nie ze skryptu. (Return
na najwyższym poziomie skryptu skrypt zostanie zakończony, ale to nie było pytanie.)Zgłoszenie wyjątku będzie dobre, szczególnie jeśli chcesz wyjaśnić przyczynę błędu:
Spowoduje to wygenerowanie błędu zakończenia.
źródło
Być może lepiej jest użyć „pułapki”. Pułapka programu PowerShell określa blok kodu do uruchomienia, gdy wystąpi błąd lub błąd. Rodzaj
aby dowiedzieć się więcej o instrukcji pułapki.
źródło
Przypadkowo odkryłem, że (np. Po prostu tam , gdzie etykieta nie istnieje ) wydaje się, że wyłamuje się z całego skryptu (nawet z funkcji) i utrzymuje hosta przy życiu. W ten sposób możesz stworzyć funkcję, która łamie skrypt z dowolnego miejsca (np. Pętla rekurencyjna) bez znajomości bieżącego zakresu (i tworzenia etykiet):
Break <UnknownLabel>
Break Script
Script
źródło
Użyłem tego do ponownego uruchomienia programu. Nie wiem, czy to by pomogło, ale jest to prosta instrukcja if wymagająca tylko dwóch różnych wpisów. Dla mnie działało to w PowerShell.
Nie wiem, czy to pomaga, ale wierzę, że byłoby to zgodne z zakończeniem programu po jego uruchomieniu. Jednak w tym przypadku każde zdefiniowane wejście wymaga wyszczególnionego i skategoryzowanego wyniku. Możesz również poprosić exit o wywołanie nowego wiersza polecenia i zakończenie programu w ten sposób.
źródło