奇怪的CMD批处理脚本报告%errorlevel%

时间:2011-02-09 17:09:02

标签: oracle batch-file cmd sqlplus errorlevel

在下面的脚本中,当出现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

1 个答案:

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