尊重msbuild调用的批处理文件中的退出代码

Dan*_*nov 8 msbuild batch-file msbuild-task

我有一个批处理文件,使用该exit命令返回退出代码.

在某些情况下,可以从命令行交互地调用此批处理文件,或者在其他情况下,可以使用该Exec任务作为MSBuild项目的一部分运行该批处理文件.

  • 如果我exit %errorlevel%在我的批处理文件中使用这很好,并且MSBuild看到错误代码,但是在这种情况下,从命令窗口运行批处理文件的交互式用户将获得cmd.exe的粗略退出.
  • 如果我使用exit /b %errorlevel%交互式场景没有得到粗鲁的退出,但这也意味着cmd我的Exec任务启动也没有退出,因此MSBuild没有看到返回值.

作为这两个问题的解决方案,我试图使用exit /b但是从我的构建脚本中启动批处理文件,如下所示:

<Exec Command="Batch.cmd params &amp; exit %errorlevel%" />
Run Code Online (Sandbox Code Playgroud)

这个想法是我明确地从'非终端'返回exit /b并手动调用exitcmd.exeExecBuild Task可以看到它之外传播这个值.

这似乎是完美的解决方案,但它不起作用.Exec仍然没有得到正确的错误值.

Say*_*imi 13

处理此问题的一种方法是让MSBuild将参数传递给批处理文件,以便它知道MSBuild正在调用它而不是从命令提示符调用它.例如,我创建了如下所示的示例文件test.bat

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%
Run Code Online (Sandbox Code Playgroud)

我已经创建了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>
Run Code Online (Sandbox Code Playgroud)

如果从命令提示符执行文件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
Run Code Online (Sandbox Code Playgroud)

从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
Run Code Online (Sandbox Code Playgroud)

Sayed Ibrahim Hashimi

我的书:Microsoft Build Engine内部:使用MSBuild和Team Foundation Build