batch-file file教學 - 如何在遇到錯誤時使批處理文件終止?




5 Answers

檢查if語句中的錯誤errorlevel ,然後exit /b (僅退出b atch文件,而不是整個cmd.exe進程)以獲取0以外的值。

same-executable-over-and-over.exe /with different "parameters"
if %errorlevel% neq 0 exit /b %errorlevel%

如果你想讓錯誤級別的值傳播到你的批處理文件之外

if %errorlevel% neq 0 exit /b %errorlevel%

但如果這是在一個for它有點棘手。 你需要更多的東西:

setlocal enabledelayedexpansion
for %%f in (C:\Windows\*) do (
    same-executable-over-and-over.exe /with different "parameters"
    if !errorlevel! neq 0 exit /b !errorlevel!
)

編輯:你必須在每個命令後檢查錯誤。 cmd.exe / command.com批處理中沒有全局的“錯誤goto”類型的構造。 我還更新了每個CodeMonkey代碼,儘管我從未在XP或Vista上進行任何批量黑客攻擊時遇到過負面錯誤級別。

file指令 file參數

我有一個批處理文件,它使用不同的參數反複調用同一個可執行文件。 如果其中一個調用返回任何級別的錯誤代碼,我該如何立即終止?

基本上,我想要相當於MSBuild的ContinueOnError=false




最短的:

command || exit /b

如果您需要,您可以設置退出代碼:

command || exit /b 666

你也可以登錄:

command || echo ERROR && exit /b



這裡是BASH和Windows CMD的多語言程序 ,它運行一系列命令並退出,如果它們中的任何一個失敗:

#!/bin/bash 2> nul

:; set -o errexit
:; function goto() { return $?; }

command 1 || goto :error

command 2 || goto :error

command 3 || goto :error

:error

:; exit 0
exit /b 0

:error
exit /b %errorlevel%

過去我使用過這種類型的東西來實現多平台持續集成腳本。




無論我如何嘗試,即使msbuild失敗,錯誤級別也始終保持為0。 所以我建立了我的解決方法:

構建項目並將日誌保存到Build.log

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

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

在構建日誌中搜索“0 Error”字符串,將結果設置為var

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

得到最後一個字符,它表示有多少行包含搜索字符串

set result=%var:~-1%

echo "%result%"

如果找不到字符串,那麼錯誤> 0,編譯失敗

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

該解決方案受到Mechaflash的文章的啟發, 如何將命令輸出設置為批處理文件中的變量

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




@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



Related


Tags

batch-file