Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
接受msbuild调用的批处理文件的退出代码_Msbuild_Batch File_Msbuild Task - Fatal编程技术网

接受msbuild调用的批处理文件的退出代码

接受msbuild调用的批处理文件的退出代码,msbuild,batch-file,msbuild-task,Msbuild,Batch File,Msbuild Task,我有一个批处理文件,它使用exit命令返回退出代码 在某些情况下,可以从命令行交互调用此批处理文件,或者在其他情况下,可以使用Exec任务作为MSBuild项目的一部分运行此批处理文件 如果我在批处理文件中使用exit%errorlevel%,这会很好地工作,并且MSBuild会看到错误代码,但是,在这种情况下,从命令窗口运行批处理文件的交互式用户将粗暴地退出cmd.exe 如果我使用exit/b%errorlevel%交互场景不会得到粗暴的退出,但这也意味着由我的Exec任务启动的cmd也不

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

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

  • 如果我在批处理文件中使用
    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
构建任务可以看到它的地方


这似乎是一个完美的解决方案,但它不起作用
Exec仍然无法获取正确的错误值。

处理此问题的一种方法是让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>
从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
赛义德·易卜拉欣·哈希米


我的书:

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

这个问题有点老了,但是响应可能仍然很有趣,所以下面是:

将MSBuild任务稍微修改为

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

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