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は最初に、それらがすべて1行に記述されているかのようにそれらのコマンドを読み込み、変数を展開します。したがって、最初のコードブロックでは、ブロックが解析されるときに%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
)

(3であると仮定$RELEASE)。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 に答える