我遇到了< exec>的问题我的NAnt项目文件中批处理文件的任务。在Windows XP SP 3(但不是Windows Vista或Windows Server 2008)上运行并使用NAnt 0.85或0.91alpha2时,< exec>无论执行的脚本返回什么,任务总是会成功(返回错误代码0)。
作为一个例子,我写了下面的NAnt目标:
<target name="build">
<exec program="fail.bat"
failonerror="false" resultproperty="makeall.result">
</exec>
<echo message="Makeall task returned result ${makeall.result}"/>
<fail if="${int::parse(makeall.result) != 0}">Encountered ${makeall.result} errors.</fail>
</target>
调用以下批处理文件:
exit /b 1
在正常操作(Windows Vista)下,运行NAnt的结果是:
build:
[exec] C:\Users\Will\Code>exit /b 1
[exec] C:\Users\Will\Code\fail.build(6,4):
[exec] External Program Failed: C:\Users\Will\Code\fail.bat (return code was 1)
[echo] Makeall task returned result 1
BUILD FAILED - 1 non-fatal error(s), 0 warning(s)
但是在两台不同的Windows XP SP3机器上,运行NAnt的结果是:
build:
[exec] C:\Documents and Settings\Will\My Documents\My Code>exit /b 1
[echo] Makeall task returned result 0
BUILD SUCCEEDED
虽然我并不打算说这是一个bug的可能性,但我发现我更有可能忘记导致此行为的Windows或NAnt上的一些关键配置设置。有人遇到过这种情况么?是否有一个相当优雅的解决方法?
答案 0 :(得分:0)
Nant包含2个可能对您有用的功能:
通过这些,您可以编写目标来生成预期的构建结果属性。然后应该可以将预期结果与返回的实际结果进行比较。这样您就可以处理特定于操作系统的场景。
至于两个结果之间差异的“根本原因”,我不知道为什么它们在Windows版本之间会有所不同。
答案 1 :(得分:0)
这是我们使用的格式,它似乎总是适用于我们。 dexbuild .bat文件包含
---------2.0 ------------- "C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv" C:\YourProject\YourSoultion.sln /Rebuild release
----------3.5-------------- "C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\devenv" C:\YourProject\YourSoultion.sln /Rebuild release
similar logic for 4.0
ccnet.config
<tasks>
<nant>
<executable>C:\Nant\Nant0.86\bin\nant.exe</executable>
<baseDirectory>.</baseDirectory>
<buildFile>C:\NANT_SCRIPTS\build.xml</buildFile>
<targetList>
<target>DexWeb</target>
</targetList>
<buildTimeoutSeconds>2000</buildTimeoutSeconds>
</nant>
</tasks>
build.xml file
<target name="DexWeb">
<exec program="C:\NANT_SCRIPTS\continous\dexbuild.bat" />
</target>
答案 2 :(得分:0)
我能够使用this blog post上的评论来解决这个问题,请参阅Scott的评论。
在批处理文件的开头我设置了SETLOCAL enabledelayedexpansion
然后使用以下SQLCMD
FOR /R %SCRIPTDIR% %%G IN (*.sql) DO (
sqlcmd -S%SERVER% -d %DB% -E -h-1 -w255 -i "%%G" -b -m 1 -r
echo %%G
IF !ERRORLEVEL! NEQ 0 GOTO ERROR
)
最后批处理文件中的标签
:ERROR
SET ERRORLEVEL=!ERRORLEVEL!
GOTO ERRORExit
:ResultCode
EXIT /B %1
:ERRORExit
ENDLOCAL & CALL :ResultCode %ERRORLEVEL%
请注意,返回值仍未传递回nant但构建失败正常。我尝试过resultproperty和failonerror的各种组合,但没有成功。
适用于带NANT0.90的WinXPsp3。
SC