遵循由msbuild调用的批处理文件的退出代码

8

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

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

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

作为解决这两个问题的方法,我正在尝试使用exit /b,但像这样从我的构建脚本启动批处理文件:

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

我的想法是明确从exit /b返回的“非终端”值,并手动调用exit以在cmd.exe之外传播此值,以便Exec Build任务可以看到它。

这似乎是完美的解决方案,但实际上并没有起作用。 Exec仍然无法获取正确的错误值。

3个回答

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%

我已经创建了一个名为wrapper.proj的MSBuild文件,其内容如下:

<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

2
这个问题有点旧,但是回答仍然可能会有帮助,所以在此提供:

略微修改你的MSBuild任务:

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

保持并保留

标签

exit /b %errorlevel%

在你的Batch.cmd文件中。


0

我没有尝试过这个,但如果您只是设置一个名为ERRORLEVEL的环境变量会怎样呢?在Exec命令的内容后隐藏,MSBuild有"exit %ERRORLEVEL%"。如果设置了%ERRORLEVEL%,它将覆盖任何实际的错误级别。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接