372 Stimmen

Wie bringe ich eine Batchdatei dazu, bei einem Fehler abzubrechen?

Ich habe eine Batch-Datei, die immer wieder dieselbe ausführbare Datei mit unterschiedlichen Parametern aufruft. Wie kann ich dafür sorgen, dass die Datei sofort beendet wird, wenn einer der Aufrufe einen Fehlercode irgendeiner Stufe zurückgibt?

Im Grunde möchte ich das Äquivalent von MSBuilds ContinueOnError=false .

2voto

Amr Ali Punkte 2068

Wir können uns nicht immer auf ERRORLEVEL verlassen, denn oft geben externe Programme oder Batch-Skripte keine Exit-Codes zurück.

In diesem Fall können wir generische Prüfungen für Fehler wie diese verwenden:

IF EXIST %outfile% (DEL /F %outfile%)
CALL some_script.bat -o %outfile%
IF NOT EXIST %outfile%  (ECHO ERROR & EXIT /b)

Und wenn das Programm etwas auf der Konsole ausgibt, können wir es auch überprüfen.

some_program.exe 2>&1 | FIND "error message here" && (ECHO ERROR & EXIT /b)
some_program.exe 2>&1 | FIND "Done processing." || (ECHO ERROR & EXIT /b)

1voto

E.Seven Punkte 11

Egal wie ich es versuche, der Errorlevel bleibt immer 0, auch wenn msbuild fehlgeschlagen ist. Also habe ich meinen Workaround gebaut:

Projekt erstellen und Protokoll in Build.log speichern

SET Build_Opt=/flp:summary;logfile=Build.log;append=true

msbuild "myproj.csproj" /t:rebuild /p:Configuration=release /fl %Build_Opt%

Suche nach der Zeichenkette "0 Error" im Erstellungsprotokoll, Setzen des Ergebnisses auf var

FOR /F "tokens=* USEBACKQ" %%F IN (`find /c /i "0 Error" Build.log`) DO (
    SET var=%%F
)
echo %var%

liefert das letzte Zeichen, das angibt, in wie vielen Zeilen der Suchbegriff enthalten ist

set result=%var:~-1%

echo "%result%"

wenn String nicht gefunden, dann Fehler > 0, Build fehlgeschlagen

if "%result%"=="0" ( echo "build failed" )

Diese Lösung wurde inspiriert durch Mechaflashs Beitrag auf Ausgabe von Befehlen als Variable in einer Batch-Datei

et https://ss64.com/nt/syntax-substring.html

-3voto

Demican Punkte 9
@echo off

set startbuild=%TIME%

C:\WINDOWS\Microsoft.NET\Framework\v3.5\msbuild.exe c:\link.xml /flp1:logfile=c:\link\errors.log;errorsonly /flp2:logfile=c:\link\warnings.log;warningsonly || goto :error

copy c:\app_offline.htm "\\lawpccnweb01\d$\websites\OperationsLinkWeb\app_offline.htm"

del \\lawpccnweb01\d$\websites\OperationsLinkWeb\bin\ /Q

echo Start Copy: %TIME%

set copystart=%TIME%

xcopy C:\link\_PublishedWebsites\OperationsLink \\lawpccnweb01\d$\websites\OperationsLinkWeb\ /s /y /d

del \\lawpccnweb01\d$\websites\OperationsLinkWeb\app_offline.htm

echo Started Build: %startbuild%
echo Started Copy: %copystart%
echo Finished Copy: %TIME%

c:\link\warnings.log

:error

c:\link\errors.log

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X