Windows-Batch-Datei Errorlevel Frage
-
19-09-2019 - |
Frage
Ich habe eine Batch-Datei bekam, die aus einer Textdatei eine Reihe von Dateinamen analysiert und verknüpft sie zu einem einzigen stark - es wurde vorher diskutiert hier . Aber ich will nicht die Zeichenfolge, die eine Datei enthalten, wenn die Datei einen Fehler aus, wenn ich es durch einigen Befehl ausführen (wie ein VCS-Check, zum Beispiel). Hier ist mein Versuch:
set FILE_LIST=
for /f %%x in (temp.txt) do (
:: perform a VCS test
accurev diff -b %%x
:: skip concatenation if error level is > 2
IF errorlevel 2 GOTO NEXT
:: perform the concatenation
set FILE_LIST=!FILE_LIST! %%x
:NEXT
:: print a message if here due to an error above
IF errorlevel 2 echo VCS problem with this file: %%x
)
Das Problem ist - das Skript die gesamte Ausführung for-Schleife zu beenden erscheint, sobald es ein Errorlevel größer als 2 findet Wenn es fünf Dateien in der Liste enthalten sind und der dritte ein VCS Problem hat - das Skript nur Griffe die ersten beiden.
Lösung
setlocal ENABLEDELAYEDEXPANSION
set FILE_LIST=
for /f %%x in (temp.txt) do (
accurev diff -b "%%~x"
IF errorlevel 2 (
echo VCS problem with this file: %%~x
) ELSE (
set FILE_LIST=!FILE_LIST! %%x
)
)
Andere Tipps
IF Error-Konstruktion hat eine seltsame Eigenschaft ... es gibt TRUE zurück, wenn die Rückgabecode war gleich oder höher als die angegebenen Fehlerebene.
Link zu verstehen, wie mit dem "Feature" befassen.