对于Windows XP上的批处理文件,NAnt <exec>任务始终返回0 </exec>

时间:2010-10-04 00:55:23

标签: windows-xp batch-file nant exec

我遇到了&lt; exec&gt;的问题我的NAnt项目文件中批处理文件的任务。在Windows XP SP 3(但不是Windows Vista或Windows Server 2008)上运行并使用NAnt 0.85或0.91alpha2时,&lt; exec&gt;无论执行的脚本返回什么,任务总是会成功(返回错误代码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上的一些关键配置设置。有人遇到过这种情况么?是否有一个相当优雅的解决方法?

3 个答案:

答案 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