2009-05-18 71 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中。

相关问题