我在MSBUILD中定义了一个目标来执行一个批处理文件,该文件由多个(接近100个或更多)xcopy命令组成。
我观察到MSBUILD仅在批处理文件中最后一次xcopy失败的情况下才会失败。如果任何其他xcopy失败并且最后一个成功,则MSBUILD认为构建成功。
是否有一种方法可以在批处理文件的末尾捕获所有错误并返回失败,这样即使批处理文件中的任何位置发生单个故障,MSBUILD也可能会失败。
由于 Shravan
答案 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个未更改的文件,并且使用任务可以产生更好的输出,以便在未来诊断性能问题。