接受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项目的一部分运行此批处理文件
- 如果我在批处理文件中使用
,这会很好地工作,并且MSBuild会看到错误代码,但是,在这种情况下,从命令窗口运行批处理文件的交互式用户将粗暴地退出cmd.exeexit%errorlevel%
- 如果我使用
交互场景不会得到粗暴的退出,但这也意味着由我的exit/b%errorlevel%
任务启动的Exec
也不会退出,因此MSBuild看不到返回值cmd
exit/b
,但从构建脚本启动批处理文件,如下所示:
<Exec Command="Batch.cmd params & 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 && exit %errorlevel%"' />
在Batch.cmd中
<Exec Command='cmd.exe /C "call Batch.cmd params && exit %errorlevel%"' />
exit /b %errorlevel%