Ich habe eine Batch-Datei, die dieselbe ausführbare Datei immer wieder mit unterschiedlichen Parametern aufruft. Wie kann ich es sofort beenden, wenn einer der Aufrufe einen Fehlercode einer beliebigen Ebene zurückgibt?
Grundsätzlich möchte ich das Äquivalent von MSBuild ContinueOnError=false
.
batch-file
Josh Kodroff
quelle
quelle
Antworten:
Überprüfen Sie die Anweisung
errorlevel
in einerif
Anweisung und suchen Sie dannexit /b
( beenden Sie nur die B atch-Datei, nicht den gesamten Prozess cmd.exe) auf andere Werte als 0.Wenn Sie möchten, dass sich der Wert der Fehlerstufe außerhalb Ihrer Batchdatei ausbreitet
aber wenn dies in einem ist, wird
for
es ein bisschen schwierig. Sie benötigen etwas mehr wie:Bearbeiten: Sie müssen den Fehler nach jedem Befehl überprüfen. Es gibt kein globales Konstrukt vom Typ "on error goto" im Stapel "cmd.exe / command.com". Ich habe meinen Code auch per CodeMonkey aktualisiert , obwohl ich bei keinem meiner Batch-Hacking-Vorgänge unter XP oder Vista einen negativen Fehler festgestellt habe.
quelle
neq
) aktiviert / deaktiviert spielen keine Rolle bei der Verwendung,if not errorlevel 1 exit /B
wie von Microsoft im Support-Artikel Verwenden von Befehlsumleitungsoperatoren und in der Hilfeausgabe beim Ausführenif /?
in einem Cmd-Fenster erläutert . Die aktuelle Fehlerstufe (Exit-Code) wird beim Beenden der Verarbeitung der Batch-Datei mit beibehaltenexit /B
. Hinweis: Wenn für denexit
Parameter/B
aktivierte Befehlserweiterungen erforderlich sind, siehe Wohin kehrt GOTO: EOF zurück?Fügen Sie
|| goto :label
zu jeder Zeile hinzu und definieren Sie dann a:label
.Erstellen Sie beispielsweise diese CMD-Datei:
Siehe auch Frage zum Beenden der Batchdatei-Subroutine .
quelle
command || (SET ErrorLine=102 && goto :error)
||
es überhaupt geschaffen wurde. Vielleicht nicht besonders, aber "versuchen Sie es mit einem Fehler", wie Fowl erwähnte. Meine Frage ist, ob dies für alle Exit-Codes ungleich Null funktioniert. Nur positiv?cmd /k exit -1 && echo success || echo fail
- Drucke schlagen fehl.command || exit /b %errorlevel%
Der kürzeste:
Bei Bedarf können Sie den Exit-Code festlegen:
Und Sie können auch protokollieren:
quelle
%ERRORLEVEL%
ist unberührt, wenn Sie anrufenexit /b
, so dass der Fehlercode weitergeleitet wirdBei einem kleinen Update sollten Sie die Überprüfungen für "if errorlevel 1" wie folgt ändern ...
Dies liegt daran, dass Sie unter XP negative Zahlen als Fehler erhalten können. 0 = keine Probleme, alles andere ist ein Problem.
Und denken Sie daran, wie DOS die "IF ERRORLEVEL" -Tests behandelt. Es wird true zurückgegeben, wenn die Nummer, nach der Sie suchen, diese Nummer oder höher ist. Wenn Sie also nach bestimmten Fehlernummern suchen, müssen Sie mit 255 beginnen und nach unten arbeiten.
quelle
Hier ist ein Polyglot-Programm für BASH und Windows CMD, das eine Reihe von Befehlen ausführt und beendet, wenn einer von ihnen fehlschlägt:
Ich habe diese Art von Dingen in der Vergangenheit für ein Skript zur kontinuierlichen Integration mehrerer Plattformen verwendet .
quelle
Ich bevorzuge die ODER-Befehlsform, da ich sie am besten lesbar finde (im Gegensatz zu einem Wenn nach jedem Befehl). Die naive Art, dies zu tun,
command || exit /b %ERRORLEVEL%
ist jedoch falsch .Dies liegt daran, dass Batch Variablen beim ersten Lesen einer Zeile erweitert und nicht, wenn sie verwendet werden. Dies bedeutet, dass, wenn das
command
in der obigen Zeile fehlschlägt, die Batchdatei ordnungsgemäß beendet wird, jedoch mit dem Rückkehrcode 0 beendet wird, da der Wert von%ERRORLEVEL%
am Anfang der Zeile stand. Offensichtlich ist dies in unserem Skript unerwünscht, daher müssen wir die verzögerte Erweiterung wie folgt aktivieren :Dieses Snippet führt die Befehle 1 bis 4 aus. Wenn einer von ihnen fehlschlägt, wird es mit demselben Exit-Code beendet wie der fehlgeschlagene Befehl.
quelle
Wir können uns nicht immer auf ERRORLEVEL verlassen, da externe Programme oder Batch-Skripte häufig keine Exit-Codes zurückgeben.
In diesem Fall können wir generische Überprüfungen für Fehler wie diesen verwenden:
Und wenn das Programm etwas an die Konsole ausgibt, können wir es auch überprüfen.
quelle
Egal wie ich es versucht habe, die Fehlerstufe bleibt immer 0, auch wenn msbuild fehlgeschlagen ist. Also habe ich meine Problemumgehung erstellt:
Projekt erstellen und Protokoll in Build.log speichern
Suchen Sie im Build-Protokoll nach der Zeichenfolge "0 Error" und setzen Sie das Ergebnis auf var
Holen Sie sich das letzte Zeichen, das angibt, wie viele Zeilen die Suchzeichenfolge enthalten
Wenn die Zeichenfolge nicht gefunden wurde, ist der Fehler> 0, Build fehlgeschlagen
Diese Lösung wurde von Mechaflashs Beitrag unter So legen Sie Befehle fest, die als Variable in einer Batchdatei ausgegeben werden
und https://ss64.com/nt/syntax-substring.html
quelle
for /f %%F in ('type build.log^|find /c /i "0 Error") do set result=%%F
. Hinweis:find "0 Error"
wird auch finden10 Errors
.quelle