Вздох.Это все, что связано с ужасным разбором 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, конечно).