我使用Ant exec
任务调用批处理文件,并在resultpropery
中设置结果。但返回值永远不会来到Ant。以下是我的代码
<property name="BuildErrorCode" value="abc"/>
<exec executable="cmd" resultproperty="BuildErrorCode" failonerror="false"
dir="C:\workspace\build\">
<arg value="/c"/>
<arg value="cmake_cross_compile.bat"/>
</exec>
<echo message="Error Code:=${BuildErrorCode}" />
我退出我的批处理脚本:
if %errorlevel% neq 0 exit /b %errorlevel%
当脚本运行时,我总是将abc
作为值而不是批处理文件的返回值。我的批处理文件现在返回2
,我必须停止构建
我想做以下事情:
知道如何让他返回值并使ant构建失败吗?
答案 0 :(得分:8)
如果以详细模式(ant -v
)运行构建脚本,您会注意到该行
Override ignored for property "BuildErrorCode"
基本上一旦设置了ant属性,就无法更改其值。这个SO question有详细信息。
可能的解决方法是不declare
财产。
...
<!--property name="BuildErrorCode" value="abc"/-->
<exec executable = "cmd" resultproperty="BuildErrorCode" failonerror="false" dir="D:\work">
<arg value="/c"/>
<arg value="cmake_cross_compile.bat"/>
</exec>
...
答案 1 :(得分:7)
exec
任务resultproperty
将捕获cmd解释器的退出代码。您在批处理文件中调用exit的方式虽然不是终止cmd,但它只退出脚本。 cmd的退出代码不受影响,保持为零。如果您只是删除exit命令的\b
选项,您也将终止解释器,并查看您提供的退出代码。
if %errorlevel% neq 0 exit %errorlevel%
要失败,您可以使用fail
task,也许是这样的:
<fail message="cmake_cross_compile.bat exited non-zero">
<condition>
<not>
<equals arg1="${BuildErrorCode}" arg2="0"/>
</not>
</condition>
</fail>
或者您可以将failonerror="true"
任务中的exec
设置为立即失败。