批处理文件 - 错误代码

时间:2014-01-13 22:56:16

标签: batch-file msbuild

我在MSBUILD中定义了一个目标来执行一个批处理文件,该文件由多个(接近100个或更多)xcopy命令组成。

我观察到MSBUILD仅在批处理文件中最后一次xcopy失败的情况下才会失败。如果任何其他xcopy失败并且最后一个成功,则MSBUILD认为构建成功。

是否有一种方法可以在批处理文件的末尾捕获所有错误并返回失败,这样即使批处理文件中的任何位置发生单个故障,MSBUILD也可能会失败。

由于 Shravan

3 个答案:

答案 0 :(得分:2)

是的,AWinkle的解决方案是解决此问题的正确方法。但是,它要求您在现有XCOPY命令的每个之后插入一行!下面的批处理文件允许您按原样保留所有100多个命令,只需在开头插入一小段代码:

@echo off
setlocal EnableDelayedExpansion

rem Locate the beginning of XCOPY commands in this Batch file:
for /F "delims=:" %%a in ('findstr /N /B "XCOPY_COMMANDS" "%~F0"') do set skip=%%a

rem Process the XCOPY commands and accumulate ERRORLEVELS from they all
set AccumulatedErrorLevel=0
for /F "usebackq skip=%skip% delims=" %%a in ("%~F0") do (
   %%a
   set /A AccumulatedErrorLevel+=!errorlevel!
)
rem Return the accumulated value
exit /B %AccumulatedErrorLevel%

rem Place the original XCOPY commands below next line until the end of this file:
XCOPY_COMMANDS

答案 1 :(得分:1)

ERRORLEVEL仅由最后一个XCOPY命令设置。您需要在每个XCOPY之后记录ERRORLEVEL

即使先前失败,也会尝试所有XCOPY命令:

@ECHO OFF
SET CURRENT_ERROR_LEVEL=0

REM Repeat this for each of your XCOPY commands
xcopy c:\temp\test.* e:\ /Q /Y > nil
SET /A CURRENT_ERROR_LEVEL=%CURRENT_ERROR_LEVEL%+%ERRORLEVEL%

EXIT /B %CURRENT_ERROR_LEVEL%

答案 2 :(得分:0)

将批处理文件中的逻辑作为任务而不是exec任务移植到MsBuild目标中。

这将允许您的目标以增量方式构建,以便您不再为每个构建任意复制100个未更改的文件,并且使用任务可以产生更好的输出,以便在未来诊断性能问题。