Jak mogę zakończyć plik wsadowy po napotkaniu błędu?
290
Mam plik wsadowy, który w kółko wywołuje ten sam plik wykonywalny z różnymi parametrami. Jak sprawić, by zakończyło się natychmiast, jeśli jedno z wywołań zwróci kod błędu dowolnego poziomu?
Jaka powłoka poleceń uruchomi twój skrypt? DOS / Win9x's command.com lub Win2k +'s cmd.exe? Skoro to robi różnicę, czy mógłbyś wyjaśnić to w edycji swojego pytania?
Sprawdź, czy errorlevelw ifrachunku, a następnie exit /b(opuścić b plik Atch tylko nie cały proces cmd.exe) do wartości innych niż 0.
same-executable-over-and-over.exe /with different "parameters"
if %errorlevel% neq 0 exit /b %errorlevel%
Jeśli chcesz, aby wartość poziomu błędu propagowała się poza plikiem wsadowym
if %errorlevel% neq 0 exit /b %errorlevel%
ale jeśli to jest w środku for, staje się to trochę trudne. Potrzebujesz czegoś więcej:
setlocal enabledelayedexpansion
for %%f in (C:\Windows\*) do (
same-executable-over-and-over.exe /with different "parameters"
if !errorlevel! neq 0 exit /b !errorlevel!
)
Edycja: Musisz sprawdzić błąd po każdym poleceniu. W partii cmd.exe / command.com nie ma globalnego typu „na błąd goto”. Zaktualizowałem również mój kod według CodeMonkey , chociaż nigdy nie spotkałem się z ujemnym poziomem błędu w żadnym z moich hackowań wsadowych na XP lub Vistę.
Opóźnione rozszerzenie włączone / wyłączone lub rozszerzenia poleceń (wymagane dla neq) włączone / wyłączone nie ma znaczenia przy używaniu, if not errorlevel 1 exit /Bjak wyjaśniono w artykule pomocy technicznej Microsoft Korzystanie z operatorów przekierowywania poleceń i pomoc wyjściowa po uruchomieniu if /?w oknie cmd. Bieżący poziom błędu (kod wyjścia) jest utrzymywany przy wychodzeniu z przetwarzania pliku wsadowego za pomocą exit /B. Uwaga: exitjeśli parametr /Bwymaga włączonych rozszerzeń poleceń, zobacz Gdzie wraca GOTO: EOF?
@MarcelValdezOrozco Wydaje mi się, że po to właśnie ||stworzono. Być może nie w szczególności, ale „spróbuj, zrób to z błędem”, jak wspomniała Fowl. Moje pytanie brzmi: czy to działa dla wszystkich niezerowych kodów wyjścia? Tylko pozytywne?
Jedna drobna aktualizacja, należy zmienić sprawdzanie „jeśli poziom błędu 1” na następujące ...
IF %ERRORLEVEL% NEQ 0
Wynika to z faktu, że w XP można uzyskać liczby ujemne jako błędy. 0 = brak problemów, wszystko inne stanowi problem.
I pamiętaj o tym, jak DOS obsługuje testy „IF ERRORLEVEL”. Zwróci wartość true, jeśli liczba, którą sprawdzasz, jest tą liczbą lub wyższą, więc jeśli szukasz określonych numerów błędów, musisz zacząć od 255 i pracować dalej.
1
Żadne ze standardowych wewnętrznych i zewnętrznych poleceń systemu Windows nigdy nie wychodzi z wartością ujemną. Microsoft ostrzega każdego programisty, aby zakończył pracę z wartością ujemną, na przykład w artykule MSDN na temat właściwości Environment.ExitCode . W rzeczywistości zawsze trzeba dowiedzieć się, który kod zakończenia jest używany przez aplikację w przypadku powodzenia, a który w przypadku różnych błędów, zobacz Warsztat pomocy HTML zwraca błąd po pomyślnym skompilowaniu pliku .chm dla negatywnego przykładu MS na oczekiwania użytkownika.
Wolę formę OR, ponieważ uważam, że są one najbardziej czytelne (w przeciwieństwie do opcji if po każdym poleceniu). Jednak naiwny sposób robienia tego command || exit /b %ERRORLEVEL%jest niewłaściwy .
Wynika to z faktu, że partia rozszerza zmienne, gdy wiersz jest czytany po raz pierwszy, a nie kiedy są używane. Oznacza to, że jeśli commandpowyższy wiersz nie powiedzie się, plik wsadowy kończy się poprawnie, ale wychodzi z kodem powrotu 0, ponieważ taka była wartość %ERRORLEVEL%na początku wiersza. Jest to oczywiście niepożądane w naszym skrypcie, dlatego musimy włączyć
opóźnioną ekspansję :
działa tylko dla liczby lss większej niż dziesięć. Lepszy; for /f %%F in ('type build.log^|find /c /i "0 Error") do set result=%%F. Uwaga: find "0 Error"również znajdzie 10 Errors.
Oprócz tego, że nie dodał żadnych komentarzy, fragment kodu nie wygląda na dobrego kandydata do wyjaśnienia funkcji: wydaje się, że zawiera wiele rzeczy, które są całkowicie nieistotne dla pytania.
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.