ustawienie ERRORLEVEL na 0

14

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=0w 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!

użytkownik972276
źródło

Odpowiedzi:

14

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

exit /b 0

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 resetuje errorleveldla ciebie, takie jak echo, findstr itp.

Na przykład następujące polecenia ustawiłyby się ERRORLEVELna 0 w pliku wsadowym:

VERIFY > nul

cmd /c "exit /b 0"

ver > nul     
TwirlMandarin
źródło
2
Prawie poprawnie. Można dostać się na „system” do korzystania z ERRORLEVEL dynamiczny prostu undefining żadnej wartości zdefiniowane przez użytkownika za pomocąset "errorlevel="
dbenham
Dlaczego Windows pozwala komuś redefiniować zmienną systemową na zwykłą? Czy nadal istnieją obie definicje, po prostu echo i inne takie polecenia wskazują teraz na zwykłą? Więc programy mogą nadal aktualizować zmienną systemową, która jest po prostu niedostępna z wiersza polecenia?
user972276,
1
„Albo to, albo użyj polecenia, które resetuje poziom błędu dla Ciebie, takiego jak echo, findstr itp.” Polecenie echo nie resetuje zmiennej poziomu błędu.
antred
Jak powiedzieli inni, jeśli errorlevel zmienna została „ręcznie” ustawiona przez użytkownika / partię za pomocą "set errorlevel=0", errorlevelzmienna 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.
Kevin Fegan
(1) Bardziej ogólne pytanie brzmi: „Jak ustawić ERRORLEVEL na dowolną dowolną wartość, na przykład 42?”  cmd /c exit 42 wydaje się być najlepszą odpowiedzią na to. (2) Jak  zauważa dbenham , nie potrzebujesz  /bani cytatów.
Scott
12

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:

set "errorlevel="

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.

(call)
echo %errorlevel%
(call )
echo %errorlevel%

Bardziej intuicyjną, ale mniej wygodną metodą ustawienia poziomu błędu jest użycie dedykowanego podprogramu w pliku wsadowym:

call :setErr 1
echo %errorlevel%
call :setErr 0
echo %errorlevel%
exit /b

:setErr
exit /b %1

Lub jeśli w wierszu poleceń, możesz użyć

cmd /c exit 1
echo %errorlevel%
cmd /c exit 0
echo %errorlevel%
dbenham
źródło
8

Ja osobiście korzystam z tego:

cd .

Działa nawet w powłoce unix.

Andry
źródło
Ale ten może być nieco szybszy: type nul>nulponieważ Monitor procesu pokazuje QueryDirectorywywołania na cd .PS: cd .ma kolejny fajny efekt uboczny w powłoce unix. Przywraca odtworzony katalog roboczy w terminalu, jeśli został otwarty przed skasowaniem.
Andry
2

Oto kilka innych sposobów resetowania ErrorLevelstanu, które działają nawet w MS-DOS (przynajmniej dla wersji 6.22):

more < nul > nul

rem // The `> nul` part can be omitted in Windows but is needed in MS-DOS to avoid a line-break to be returned:
sort < nul > nul

Następujące metody działają tylko w MS-DOS:

command /? > nul

fc nul nul > nul

Ze względu na kompletność ustawia on ErrorLevelstan 1, obowiązujący zarówno w systemie Windows, jak i MS-DOS:

< nul find ""
aschipfl
źródło
1

To jedyna rzecz, którą znalazłem, która działa.

call (exit /b 0)

Potrzebował go w skrypcie, który wykorzystuje skrypt innej firmy, który wykrywa ERRORLEVEL, ale nie resetuje poziomu błędu poprawnie.

Richard Meadows
źródło
0

Te będą również działać: (Ustawia poziom błędu na 1)

Metoda 1

color 00

Metoda 2

echo A | find "B"

Możesz także użyć tego do ustawienia poziomu błędu 1-26:

echo Your errorlevel<sup>th</sup> character between A-Z | choice /c:Enter A-Z here /n
Wasif Hasan
źródło