2014-01-13 282 views
2

我在MSBUILD定義的目標以執行它由多個(接近100個或更多)的xcopy命令的一個批處理文件。批處理文件 - 錯誤代碼

我已經觀察到的MSBuild只在最後XCOPY在批處理文件失敗的情況下失敗。如果任何其他xcopy失敗並且最後一個成功,則MSBUILD認爲構建成功。

有沒有一種辦法,我們可以捕獲所有的錯誤,並在批處理文件的最後返回失敗,這樣可以MSBUILD在批處理文件即使在單一故障失效的任何地方。

感謝 Shravan

+0

您也可以不使用批處理文件,但將每個xcopy命令放在一個MsBuild Exec任務中 – stijn

回答

1

的ERRORLEVEL僅由過去的XCOPY命令設置。你需要每個XCOPY

這將嘗試,即使失敗之前所有的XCOPY命令的後記錄ERRORLEVEL:

@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

是的,從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這是漂亮的 – stijn

+0

Xcopy返回錯誤級別1以指示沒有找到要複製的文件。它可能是一個錯誤或不是。 –

0

端口在批處理文件導入的MSBuild目標作爲任務的邏輯,而不是執行任務。

這將使使你不再隨意複製的未更改的文件100的每一個構建,並使用任務產生更好的輸出,用於診斷PERF問題在路上你的目標來構建增量。