Mam plik wsadowy, który jest zawijany wokół instalatora. Ten plik wsadowy sprawdza poziom błędu zwrócony przez instalatora i odpowiednio drukuje.
Zauważyłem, że jeśli wykonam set ERRORLEVEL=0
w wierszu polecenia tuż przed wykopaniem pliku wsadowego (w tym samym oknie poleceń / środowisku), instalator nigdy nie zadziała z poziomem błędu, a mój skrypt wsadowy zawsze powróci. Zakładam, że %ERRORLEVEL%
jest to zmienna zdefiniowana przez Windows i jest używana specjalnie do drukowania błędów z programów i skryptów, a użycie tej zmiennej w pliku wsadowym lub coś innego byłoby „na własne ryzyko”, ponieważ można ją zmienić w dowolnym momencie przez inny proces.
Z tego, co się wydaje, kiedy ustawiam poziom błędu w danym środowisku, to w jakiś sposób przerywa użycie poziomu błędu jako właściciela kodu wyjścia. Czy ktoś wie, dlaczego tak jest? Dla mnie to dziwne, nieoczekiwane zachowanie. Wszelkie informacje na ten temat byłyby bardzo mile widziane!
źródło
&&
lub||
.Odpowiedzi:
Zmieniasz definicję zmiennej systemowej na zwykłą. Gdy to zrobisz, system nie użyje go, dopóki sesja poleceń nie zostanie zamknięta.
Najlepszym sposobem byłoby użycie
w innym pliku wsadowym i wywołaj go ze skryptu podstawowego. Gdzie liczba 0 jest twoją poszukiwaną
errorlevel
. Albo to, albo użyj polecenia, które resetujeerrorlevel
dla ciebie, takie jak echo, findstr itp.Na przykład następujące polecenia ustawiłyby się
ERRORLEVEL
na 0 w pliku wsadowym:źródło
set "errorlevel="
errorlevel
zmienna została „ręcznie” ustawiona przez użytkownika / partię za pomocą"set errorlevel=0"
,errorlevel
zmienna nie będzie już odzwierciedlać kodu wyjścia, ale nadal można uzyskać dostęp do kodu wyjścia za pomocąif errorlevel do something
.cmd /c exit 42
wydaje się być najlepszą odpowiedzią na to. (2) Jak zauważa dbenham , nie potrzebujesz/b
ani cytatów.Nigdy nie należy przypisywać własnej wartości do dynamicznych zmiennych systemowych, takich jak ERRORLEVEL, PATH, CD, DATE, TIME itp. W przeciwnym razie kod nie zobaczy wartości dynamicznej. Możesz przywrócić wartość dynamiczną, po prostu nie definiując wartości zdefiniowanej przez użytkownika. Na przykład:
Jeśli chcesz, aby wymusić ERRORLEVEL 0, to można użyć tego zupełnie nieintuicyjne, ale bardzo skuteczną składni:
(call )
. Przestrzeń po wywołaniu jest krytyczna. Jeśli chcesz ustawić poziom błędu na 1, możesz użyć(call)
. Bardzo ważne jest, aby po rozmowie nie było miejsca.Bardziej intuicyjną, ale mniej wygodną metodą ustawienia poziomu błędu jest użycie dedykowanego podprogramu w pliku wsadowym:
Lub jeśli w wierszu poleceń, możesz użyć
źródło
Ja osobiście korzystam z tego:
cd .
Działa nawet w powłoce unix.
źródło
type nul>nul
ponieważ Monitor procesu pokazujeQueryDirectory
wywołania nacd .
PS:cd .
ma kolejny fajny efekt uboczny w powłoce unix. Przywraca odtworzony katalog roboczy w terminalu, jeśli został otwarty przed skasowaniem.Oto kilka innych sposobów resetowania
ErrorLevel
stanu, które działają nawet w MS-DOS (przynajmniej dla wersji 6.22):Następujące metody działają tylko w MS-DOS:
Ze względu na kompletność ustawia on
ErrorLevel
stan1
, obowiązujący zarówno w systemie Windows, jak i MS-DOS:źródło
To jedyna rzecz, którą znalazłem, która działa.
Potrzebował go w skrypcie, który wykorzystuje skrypt innej firmy, który wykrywa ERRORLEVEL, ale nie resetuje poziomu błędu poprawnie.
źródło
Te będą również działać: (Ustawia poziom błędu na 1)
Metoda 1
Metoda 2
Możesz także użyć tego do ustawienia poziomu błędu 1-26:
źródło