Ich führe ein Programm aus und möchte sehen, wie sein Rückkehrcode lautet (da es aufgrund unterschiedlicher Fehler unterschiedliche Codes zurückgibt).
Ich weiß, dass ich dies in Bash durch Laufen tun kann
echo $?
Was mache ich, wenn ich cmd.exe unter Windows verwende?
app.exe & echo %errorlevel%
Antworten:
Eine Pseudo-Umgebungsvariable mit dem Namen
errorlevel
speichert den Exit-Code:Außerdem hat der
if
Befehl eine spezielle Syntax:Siehe
if /?
für Details.Beispiel
Warnung: Wenn Sie einen Umgebungsvariablennamen festlegen
errorlevel
,%errorlevel%
wird dieser Wert und nicht der Exit-Code zurückgegeben. Verwenden Sie (set errorlevel=
), um die Umgebungsvariable zu löschen und den Zugriff auf den wahren Wert vonerrorlevel
über die%errorlevel%
Umgebungsvariable zu ermöglichen.quelle
echo Exit Code is $LastExitCode
%ERRORLEVEL%
0 ist, obwohl ein Fehler aufgetreten ist. Passiert beim Einchecken%ERRORLEVEL%
einer Cmd-Datei. Der Versuchstart /wait
hat nicht funktioniert. Das einzige, was funktioniert hat, istif errorlevel 1 (...)
string
Nicht- Variable zurückgegebenint
, was bedeutet, dass SieEQ
/NEQ
effektiv nicht verwenden können.Das Testen
ErrorLevel
funktioniert für Konsolenanwendungen , aber wie von dmihailescu angedeutet, funktioniert dies nicht, wenn Sie versuchen, eine Fensteranwendung (z. B. Win32-basiert) über eine Eingabeaufforderung auszuführen . Eine gefensterten Anwendung wird im Hintergrund ausgeführt werden , und die Steuerung kehrt sofort an die Eingabeaufforderung (höchstwahrscheinlich mit einemErrorLevel
von Null , um anzuzeigen , dass der Prozess wurde erstellt erfolgreich). Wenn eine Fensteranwendung schließlich beendet wird, geht ihr Beendigungsstatus verloren.Anstatt den an anderer Stelle erwähnten konsolenbasierten C ++ - Starter zu verwenden, besteht eine einfachere Alternative darin, eine Fensteranwendung mit dem Befehl der Eingabeaufforderung zu starten
START /WAIT
. Dadurch wird die Fensteranwendung gestartet, auf das Beenden gewartet und die Steuerung an die Eingabeaufforderung zurückgegeben, wobei der Beendigungsstatus des Prozesses festgelegt istErrorLevel
.quelle
if
oder befindetfor
. Verwenden Sie!errorlevel!
stattdessen, wie in dieser Antwort beschrieben .Verwenden Sie die integrierte ERRORLEVEL-Variable:
Aber Vorsicht , wenn eine Anwendung eine Umgebungsvariable namens Error - definiert hat !
quelle
$LastExitCode
in PowerShell aufgerufen .Wenn Sie den Fehlercode genau abgleichen möchten (z. B. gleich 0), verwenden Sie Folgendes:
if errorlevel 0
Übereinstimmungenerrorlevel
> = 0. Sieheif /?
.quelle
Es funktioniert möglicherweise nicht richtig, wenn Sie ein Programm verwenden, das nicht an die Konsole angeschlossen ist, da diese App möglicherweise noch ausgeführt wird, während Sie glauben, den Exit-Code zu haben. Eine Lösung dafür in C ++ sieht wie folgt aus:
quelle
Es ist erwähnenswert, dass .BAT- und .CMD-Dateien unterschiedlich funktionieren.
Beim Lesen von https://ss64.com/nt/errorlevel.html wird Folgendes festgestellt:
Dies verursachte mir kein Ende der Trauer, als ich aufeinanderfolgende Befehle ausführte, aber der ERRORLEVEL würde auch im Falle eines Fehlers unverändert bleiben.
quelle
Irgendwann musste ich Protokollereignisse von Cygwin genau in das Windows-Ereignisprotokoll übertragen. Ich wollte, dass die Nachrichten in WEVL benutzerdefiniert sind, den richtigen Exit-Code, Details, Prioritäten, Nachrichten usw. haben. Deshalb habe ich ein kleines Bash-Skript erstellt, um dies zu erledigen. Hier ist es auf GitHub, logit.sh .
Einige Auszüge:
Hier ist der temporäre Dateiinhaltsteil:
Hier ist eine Funktion zum Erstellen von Ereignissen in WEVL:
Ausführen des Batch-Skripts und Aufrufen von __create_event:
quelle