在下面的脚本中,当出现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
有用的链接here
答案 0 :(得分:4)
叹息。这与可怕的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。