Stellen Sie ERRORLEVEL auf 0

27266
user972276

Was ich habe, ist eine Batch-Datei, die einen Installer umgibt. Diese Stapeldatei prüft die vom Installationsprogramm zurückgegebene Fehlerstufe und druckt entsprechend. Ich habe das bemerkt, wenn ich es ausführen würdeset ERRORLEVEL=0In einer Eingabeaufforderung direkt vor dem Start der Stapeldatei (im selben Befehlsfenster / in derselben Umgebung) führt das Installationsprogramm nie zu einer Fehlerebene und das Stapelskript gibt immer "bestanden" zurück. Ich würde davon ausgehen, dass% ERRORLEVEL% eine Variable ist, die von Fenstern definiert wird, die speziell zum Ausdrucken von Fehlern in Programmen und Skripts verwendet werden, und dass die Verwendung der Variablen in einer Batchdatei oder etwas anderes "auf eigenes Risiko" wäre, da sie jederzeit geändert werden kann durch einen anderen Prozess. Wie es scheint, wenn ich errorlevel in der gegebenen Umgebung einstelle, wird die Verwendung von errorlevel als Besitzer des Exit-Codes irgendwie beendet. Weiß jemand warum das so ist? Für mich ist es nur ein komisches unerwartetes Verhalten. Jede Information zu diesem Thema wäre sehr dankbar!

11

4 Antworten auf die Frage

10
TwirlMandarin

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

Der beste Weg wäre zu verwenden

exit / b 0

in einer anderen Batchdatei und rufen Sie es von Ihrem primären Skript aus auf. Wo ist die Nummer 0 Ihr gewünschter Fehlerlevel. Entweder das oder verwenden Sie einen Befehl, der den Errorlevel für Sie zurücksetzt, z. B. Echo, Findstr usw.

Die folgenden Befehle würden beispielsweise alle ERRORLEVEL in Ihrer Batchdatei auf 0 setzen:

VERIFY > nul  cmd /c "exit /b 0"  ver > nul  
Fast richtig. Sie können das "System" zur Verwendung des dynamischen ERRORLEVEL verwenden, indem Sie mit "set" errorlevel = "` einen beliebigen benutzerdefinierten Wert aufheben dbenham vor 10 Jahren 1
Warum erlaubt Windows jemandem, eine Systemvariable in eine reguläre zu definieren? Sind beide Definitionen noch vorhanden, ist es nur ein Echo und andere solche Befehle zeigen jetzt auf die regulären Befehle. Programme könnten also immer noch die Systemvariable aktualisieren, es ist nur nicht über die Eingabeaufforderung erreichbar. user972276 vor 10 Jahren 0
"Entweder das oder verwenden Sie einen Befehl, der den Errorlevel für Sie zurücksetzt, wie Echo, Findstr usw." Der Befehl echo setzt die Variable errorlevel nicht zurück. antred vor 9 Jahren 1
Wie andere bereits gesagt haben, wenn die Variable "errorlevel" *** *** vom Benutzer / Stapel mit "set errorlevel = 0" `" manuell "gesetzt wurde, spiegelt die Variable" errorlevel "den Exit-Code nicht mehr wider , aber Sie können den Exit-Code trotzdem mit `if errorlevel tun etwas` aufrufen. Kevin Fegan vor 7 Jahren 0
9
dbenham

Sie sollten dynamischen Systemvariablen wie ERRORLEVEL, PATH, CD, DATE, TIME usw. niemals Ihren eigenen Wert zuweisen. Dadurch wird verhindert, dass der dynamische Wert durch Code angezeigt wird. Sie können den dynamischen Wert wiederherstellen, indem Sie einfach den benutzerdefinierten Wert 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 Platz nach dem Anruf ist kritisch. Wenn Sie den Errorlevel auf 1 setzen möchten, können Sie verwenden (call). Es ist wichtig, dass nach dem Aufruf kein Platz vorhanden ist.

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

Eine intuitivere, aber weniger bequeme Methode zum Festlegen des Fehlerspeichers ist die Verwendung einer dedizierten Subroutine in einer Batchdatei:

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

Oder wenn Sie in der Befehlszeile verwenden könnten

cmd /c exit 1 echo %errorlevel% cmd /c exit 0 echo %errorlevel% 
4
Andry

Ich persönlich benutze das:

cd .

Funktioniert auch in Unix-Shell.

0
Richard Meadows

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

Benötigt es in einem Skript, das ein Drittanbieter-Skript verwendet, das ERRORLEVEL erkennt, das Fehlerlevel jedoch nicht richtig zurücksetzt.