Странный пакетный скрипт CMD сообщает о% errorlevel% - PullRequest
1 голос
/ 09 февраля 2011

В приведенном ниже скрипте при возникновении ошибки sql %errorlevel% равно 0 - почему это так?

IF %RELEASE% GTR 2 (
    (
    echo WHENEVER SQLERROR EXIT FAILURE
    echo @release.sql
    echo exit
    ) | sqlplus x/x@orcl
    echo error: %errorlevel%
    if %errorlevel% gtr 0 goto dberror
)   

Если я уберу блок if (ниже), то% errorlevel% не равен нулю! Почему оператор if влияет на уровень ошибки?

    (
    echo WHENEVER SQLERROR EXIT FAILURE
    echo @release.sql
    echo exit
    ) | sqlplus x/x@orcl
    echo error: %errorlevel%
    if %errorlevel% gtr 0 goto dberror

Обновление : Поверьте, это был способ проверки на ошибку. Я думаю вместо:

if %errorlevel% gtr 0 goto dberror

.. следует использовать:

if errorlevel 1 goto dberror

Полезная ссылка здесь

1 Ответ

4 голосов
/ 09 февраля 2011

Вздох.Это все, что связано с ужасным разбором dos и точкой, в которой cmd заменяет %errorlevel% его значением.Когда вы заключаете команды с ( ... ), cmd , сначала считывает эти команды, как если бы они все были записаны в одну строку, расширяя переменные по мере необходимости.Таким образом, в вашем первом кодовом блоке %errorlevel% заменяется его значением , когда блок анализируется .Это как если бы вы написали:

IF 3 GTR 2 (
   (
   echo WHENEVER SQLERROR EXIT FAILURE
   echo @release.sql
   echo exit
   ) | sqlplus x/x@orcl
   echo error: 0
   if 0 gtr 0 goto dberror
)

(при условии, что $RELEASE было 3).Причина, по которой работает ваше исправление if errorlevel, заключается в том, что cmd не выполняет (слишком) раннее расширение переменной при повторной формулировке.Вы можете использовать call, чтобы избежать этой проблемы:

IF %RELEASE% GTR 2 (
    (
    echo WHENEVER SQLERROR EXIT FAILURE
    echo @release.sql
    echo exit
    ) | sqlplus x/x@orcl
    call echo error: %%errorlevel%%
    call if %%errorlevel%% gtr 0 goto dberror
)

(что, я думаю, яснее, чем startlocal ENABLEDELAYEDEXPANSION и !errorlevel! - YMMV, конечно).

...