1

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

有用的链接在这里

4

1 回答 1

4

叹。这与可怕的 dos 解析以及cmd替换%errorlevel%为其值的点有关。当您用(...括起命令时)cmd首先读取这些命令,就好像它们都写在一行上一样,并在执行过程中扩展变量。因此,在您的第一个代码块中,在 parsed 块时%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 更清楚)。

于 2011-02-09T18:30:31.880 回答