NAnt <exec>Задача всегда возвращает 0 для пакетных файлов в Windows XP - PullRequest
0 голосов
/ 04 октября 2010

Я столкнулся с проблемой с задачей в пакетных файлах в моих файлах проекта NAnt.При работе в Windows XP SP 3 (но не в Windows Vista или Windows Server 2008) и использовании NAnt 0.85 или 0.91alpha2 задача всегда будет успешной (возвращая код ошибки 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

Хотя я не исключаю, что этоэто ошибка, я нахожу гораздо более вероятным, что я забыл некоторые важные настройки конфигурации в Windows или NAnt, которые вызывают это поведение.кто-нибудь еще сталкивался с этим?Есть ли достаточно элегантный обходной путь?

Ответы [ 3 ]

0 голосов
/ 25 октября 2010

Это формат, который мы используем, он всегда работает для нас.файл 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>  
0 голосов
/ 18 апреля 2012

Мне удалось получить эту работу, используя комментарии к этой записи в блоге , см. Комментарии Скотта.

при запуске командного файла я установил 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, но сборка завершается неудачно, OK. Я пробовал различные комбинации resultproperty и failonerror безуспешно.

Работает на WinXPsp3 с NANT0.90.

SC

0 голосов
/ 04 октября 2010

Nant содержит 2 функции, которые могут быть вам полезны:

С их помощью вы можете написать цель для генерации ожидаемого свойства результата сборки.Тогда должна быть возможность сравнить ожидаемый результат с фактическим возвращенным результатом.Таким образом, вы можете обрабатывать специфичные для ОС сценарии.

Что касается «первопричины» различий между двумя результатами, я не знаю, почему они будут разными в разных версиях Windows.

...