Jak sprawdzić kod wyjścia ostatniego polecenia w pliku wsadowym?

69

W pliku wsadowym w systemie Windows używam 7-zip w następujący sposób:

...\right_path\7z a output_file_name.zip file_to_be_compressed

Jak mogę sprawdzić kod wyjścia 7zi podjąć odpowiednie działania?

Misza Moroszko
źródło
1
Pytanie
Deanna

Odpowiedzi:

78

Sprawdź, czy kod powrotu jest większy lub równy 1:

if ERRORLEVEL 1 echo Error

lub

if %ERRORLEVEL% GEQ 1 echo Error

lub przetestuj kod powrotu równy 0:

if %ERRORLEVEL% EQU 0 echo OK

Możesz użyć innych poleceń, takich jak GOTOgdzie pokazuję echo.

Dennis Williamson
źródło
Próbowałem twojego kodu. 0 was unexpected this time.
Wystąpił
2
@Misha: Być może próbowałeś tego ze znakami procentowymi w sposób, w jaki go pierwotnie opublikowałem. Wypróbuj je bez nich lub wypróbuj inne wersje, które dodałem.
Dennis Williamson
2
Znaleziono przypadki, w których %ERRORLEVEL%wynosi 0, mimo że wystąpił błąd. Zdarzyło się podczas %ERRORLEVEL%wpisywania pliku cmd. Próbowanie start /waitnie zadziałało. Jedyne, co zadziałało, toif errorlevel 1 (...)
AlikElzin-kilaka,
4
Należy pamiętać, że poziom błędu nie jest zmienną środowiskową . Oto dobre podsumowanie pułapek i subtelności .
Nick Westgate,
Czy sugeruję użycie NEQzamiast EQUobsługi wykrywania ujemnych kodów powrotu? Nie mam pojęcia, czy Windows XP to robi, ale w nowoczesnych systemach Windows jest to rzecz…
binki,
10

To naprawdę działa, gdy masz: App1.exe wywołuje -> .bat, który działa -> app2.exe

App2 zwraca poziom błędu 1 ... ale musisz go złapać w .bat i ponownie podnieść do app1 ... w przeciwnym razie .bat zjada poziom błędu, a app1 nigdy nie wie.

Metoda:

W .bat:

app2.exe
if %ERRORLEVEL% GEQ 1 EXIT /B 1

Jest to sprawdzanie poziomu błędu po aplikacji2. Jeśli> 0, to .bat kończy działanie i ustawia poziom błędu na 1 dla aplikacji wywołującej 1.

Sam Jones
źródło
4
może być jeszcze lepiej, jeśli zwrócisz ten sam błąd z powrotem do app1. I nie próbujcie tego na zewnątrz, ale to powinno działać: if %ERRORLEVEL% GEQ 1 EXIT /B %ERRORLEVEL%.
Viktor Fonic
2
Przynajmniej w systemie Windows% ERRORLEVEL% może być liczbą ujemną (np. Mam program, który zwraca -1 w przypadku błędów). IF %ERRORLEVEL% NEQ 0 EXIT /B %ERRORLEVEL%może być lepszym rozwiązaniem. Ale naprawdę musisz wiedzieć, co program zwraca w przypadku błędów. Niektóre programy zwracają pewne niezerowe kody dla specjalnych rodzajów sukcesu.
Euro Micelli,
Jeśli app2 jest ostatnią rzeczą, którą uruchomisz w pliku nietoperza, kod błędu zostanie rozpropagowany.
AnrDaemon,