8

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

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

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

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

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

这个想法是我明确地从“非终端”返回exit /b并手动调用以在构建任务可以看到它exit的位置之外传播这个值。cmd.exeExec

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

4

3 回答 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%

我创建了 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
于 2009-05-19T03:02:41.373 回答
2

这个问题有点老了,但回答可能仍然很有趣,所以这里是:

将您的 MSBuild 任务稍微修改为

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

并保持

exit /b %errorlevel%

在您的 Batch.cmd 中。

于 2013-03-14T10:27:35.103 回答
0

我还没有尝试过,但是如果您只是设置了一个名为 ERRORLEVEL 的环境变量呢?在执行命令的内容之后隐藏,MSBuild 具有“退出 %ERRORLEVEL%”。%ERRORLEVEL% 如果设置覆盖任何实际错误级别。

于 2009-09-12T09:31:58.197 回答