2009-05-18 34 views
7

我有一個使用exit命令返回退出代碼的批處理文件。尊重由msbuild調用的批處理文件的退出代碼

在某些情況下,可以使用Exec任務,從命令行以交互方式調用此批處理文件,或者在其他情況下可以作爲MSBuild項目的一部分運行。

  • 如果我在我的批處理文件,這工作得很好,看到的MSBuild錯誤代碼中使用exit %errorlevel%然而誰是運行在命令窗口中的批處理文件將得到CMD.EXE的粗魯退出交互式用戶這個案例。
  • 如果我使用exit /b %errorlevel%交互式場景不會得到粗魯的退出,但這也意味着我的Exec任務啓動的cmd也不會退出,因此MSBuild看不到返回值。

作爲解決這兩個問題,我想使用exit /b但是從我的構建腳本啓動批處理文件是這樣的:

<Exec Command="Batch.cmd params &amp; exit %errorlevel%" /> 

的想法是,我明確地採取「非終端'從exit /b返回並手動呼叫exit以傳播cmd.exe以外的值,Exec構建任務可以看到它。

這似乎是一個完美的解決方案,但它不起作用。 Exec仍然沒有得到正確的錯誤值。

回答

13

處理此問題的一種方法是讓MSBuild將一個參數傳遞給批處理文件,以便它知道MSBuild正在調用它而不是從命令提示符處調用它。 例如,我創建了下面

ECHO OFF 

IF (%1)==() goto Start 
SET fromMSBuild=1 

:Start 

ECHO fromMSBuild:%fromMSBuild% 


REM ***** Perform your actions here ***** 

set theExitCode=101 
GOTO End 



:End 
IF %fromMSBuild%==1 exit %theExitCode% 


REM **** Not from MSBuild **** 

ECHO Exiting with exit code %theExitCode% 
exit /b %theExitCode% 

所示的樣本文件test.bat的,我已經創建了文件的MSBuild這wrapper.proj是:

<Project DefaultTargets="Demo" ToolsVersion="3.5" 
     xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <PropertyGroup> 
    <BatchFile>test.bat</BatchFile> 
    <FromMSBuild>FromMSBuild</FromMSBuild> 
    </PropertyGroup> 

    <Target Name="Demo"> 

    <Message Text="Executing batch file $(BatchFile)" Importance="high"/> 

    <PropertyGroup> 
     <_Command>$(BatchFile) $(FromMSBuild)</_Command> 
    </PropertyGroup> 

    <Exec Command="$(_Command)"> 
     <Output PropertyName="CommandExitCode" TaskParameter="ExitCode"/> 
    </Exec> 

    <Message Text="CommandExitCode: $(CommandExitCode)"/> 

    </Target> 
</Project> 

如果執行該文件下的test.bat從命令提示結果是

C:\Data\Development\My Code\Community\MSBuild\BatchFile>test.bat 

C:\Data\Development\My Code\Community\MSBuild\BatchFile>ECHO OFF 
fromMSBuild:0 
Exiting with exit code 101 

而且從MSBuild的結果是:

C:\Data\Development\My Code\Community\MSBuild\BatchFile>msbuild Wrapper.proj /t:Demo /fl /nologo 
Build started 5/18/2009 10:54:52 PM. 
Project "C:\Data\Development\My Code\Community\MSBuild\BatchFile\Wrapper.proj" on node 0 (Demo target(s)). 
    Executing batch file test.bat 
    fromMSBuild:1 
C:\Data\Development\My Code\Community\MSBuild\BatchFile\Wrapper.proj(17,5): error MSB3073: The command "test.bat FromMSBuild" exi 
ted with code 101. 
Done Building Project "C:\Data\Development\My Code\Community\MSBuild\BatchFile\Wrapper.proj" (Demo target(s)) -- FAILED. 


Build FAILED. 

"C:\Data\Development\My Code\Community\MSBuild\BatchFile\Wrapper.proj" (Demo target) (1) -> 
(Demo target) -> 
    C:\Data\Development\My Code\Community\MSBuild\BatchFile\Wrapper.proj(17,5): error MSB3073: The command "test.bat FromMSBuild" e 
xited with code 101. 

    0 Warning(s) 
    1 Error(s) 

Time Elapsed 00:00:00.06 

賽義德·易卜拉欣·哈希米

的My Book:Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

0

我沒有試過,但是如果你只是設置一個名爲ERRORLEVEL的環境變量?隱藏在Exec命令的內容之後,MSBuild已經「退出%ERRORLEVEL%」。 %ERRORLEVEL%如果設置覆蓋任何實際的錯誤級別。

2

這個問題是有點老,但反應仍可能會感興趣,所以這裏有雲:

稍微修改您的MSBuild任務

<Exec Command='cmd.exe /C "call Batch.cmd params &amp;&amp; exit %errorlevel%"' /> 

而且保持

exit /b %errorlevel% 

在你的Batch.cmd中。

相關問題