Setzen Sie ERRORLEVEL auf 0

12

Was ich habe, ist eine Stapeldatei, die ein Wrapper um ein Installationsprogramm ist. Diese Batch-Datei überprüft die vom Installationsprogramm zurückgegebene Fehlerstufe und druckt entsprechend. Mir ist aufgefallen, dass ich bei der Ausführungset ERRORLEVEL=0In einer Eingabeaufforderung direkt vor dem Start der Batch-Datei (in demselben Befehlsfenster / derselben Umgebung) führt das Installationsprogramm keine Fehler durch, und mein Batch-Skript gibt immer bestanden zurück. Ich gehe davon aus, dass% ERRORLEVEL% eine Variable ist, die von Fenstern definiert wird, die speziell zum Ausdrucken von Fehlern aus Programmen und Skripten verwendet werden, und dass die Verwendung der Variablen in einer Batch-Datei oder etwas anderem auf eigenes Risiko erfolgt, da sie jederzeit geändert werden kann durch einen anderen Prozess. So wie es aussieht, beendet es die Verwendung von errorlevel als Inhaber des Exit-Codes, wenn ich errorlevel in der gegebenen Umgebung setze. Weiß jemand warum das so ist? Für mich ist es einfach seltsames unerwartetes Verhalten. Alle Informationen zu diesem Thema wäre sehr dankbar!

user972276
quelle

Antworten:

12

Sie definieren die Systemvariable in eine reguläre Variable um. Wenn Sie dies tun, wird das System es nicht verwenden, bis die Befehlssitzung geschlossen wird.

Der beste Weg wäre zu benutzen

exit / b 0

in einer anderen Batch-Datei und rufen Sie es von Ihrem primären Skript. Wobei die Zahl 0 Ihre gewünschte Fehlerstufe ist. Entweder das oder Sie verwenden einen Befehl, der den Fehlerlevel für Sie zurücksetzt, wie zB echo, findstr usw.

Zum Beispiel würden die folgenden Befehle alle ERRORLEVEL in Ihrer Batch-Datei auf 0 setzen:

VERIFY > nul

cmd /c "exit /b 0"

ver > nul     
TwirlMandarin
quelle
2
Fast richtig. Sie können das "System" dazu bringen, das dynamische ERRORLEVEL zu verwenden, indem Sie einfach einen benutzerdefinierten Wert mitset "errorlevel="
dbenham
Warum erlaubt Windows jemandem, eine Systemvariable in eine reguläre umzudefinieren? Existieren beide Definitionen noch, deren Echo und andere solche Befehle zeigen jetzt auf die reguläre? So könnten Programme immer noch die Systemvariable aktualisieren, auf die nur über die Eingabeaufforderung nicht zugegriffen werden kann?
user972276
1
"Entweder das oder Sie verwenden einen Befehl, der den Fehlerlevel für Sie zurücksetzt, wie zB echo, findstr usw." Der Befehl echo setzt die Variable errorlevel nicht zurück.
Am
Wie andere gesagt haben, wenn die errorlevel Variable vom Benutzer / Stapel mit "manuell" eingestellt wurde "set errorlevel=0", wird die errorlevelVariable nicht mehr den Exit-Code widerspiegeln, aber Sie können trotzdem mit auf den Exit-Code zugreifen if errorlevel do something.
Kevin Fegan
10

Sie sollten dynamischen Systemvariablen wie ERRORLEVEL, PATH, CD, DATE, TIME usw. niemals einen eigenen Wert zuweisen. Dadurch wird verhindert, dass Code den dynamischen Wert sieht. Sie können den dynamischen Wert wiederherstellen, indem Sie einfach die Definition des benutzerdefinierten Werts aufheben. Zum Beispiel:

set "errorlevel="

Wenn Sie den Errorlevel auf 0 erzwingen wollen, dann können Sie diese völlig nicht-intuitive, verwenden aber sehr effektiv Syntax: (call ). Der Abstand nach dem Anruf ist kritisch. Wenn Sie die Fehlerstufe auf 1 setzen möchten, können Sie verwenden (call). Es ist wichtig, dass nach dem Aufruf kein Leerzeichen mehr vorhanden ist.

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

Eine intuitivere, aber weniger bequeme Methode zum Festlegen der Fehlerstufe ist die Verwendung einer dedizierten Unterroutine in einer Batchdatei:

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

:setErr
exit /b %1

Oder wenn in der Befehlszeile, könnten Sie verwenden

cmd /c exit 1
echo %errorlevel%
cmd /c exit 0
echo %errorlevel%
dbenham
quelle
7

Ich persönlich benutze das:

cd .

Funktioniert auch in Unix-Shell.

Andry
quelle
1

Dies ist das einzige, was ich gefunden habe, das funktioniert.
call (exit / b 0)

Benötigt in einem Skript, das ein Skript eines Drittanbieters verwendet, das ERRORLEVEL erkennt, die Fehlerstufe jedoch nicht ordnungsgemäß zurücksetzt.

Richard Meadows
quelle
1

Hier sind einige andere Möglichkeiten, den ErrorLevelStatus zurückzusetzen, die sogar in MS-DOS funktionieren (zumindest für Version 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

Die folgenden Methoden funktionieren nur in MS-DOS:

command /? > nul

fc nul nul > nul

Der Vollständigkeit halber wird hiermit der ErrorLevelStatus 1für Windows und MS-DOS festgelegt:

< nul find ""
aschipfl
quelle