2

私はWindows 7 Enterpriseを使用しており、条件に応じて0、1、または2を返すバッチファイルからjarを呼び出しています。同じために「System.exit」を使用しました。

以下は私のバッチスクリプトです

@echo off

java -jar "test.jar" %*
set exitcode=%ERRORLEVEL%
echo here is 1st exit code %exitcode%
if %exitcode% == 2 (    
        VERIFY > nul
        set exitcode=%ERRORLEVEL%
        echo here is 2nd exit code after VERIFY %exitcode%
        call test.exe %*
        echo here is 2nd exit code %ERRORLEVEL% 

    if %ERRORLEVEL% == 0    (
           cmd /c "exit /b 0"
           call test1.exe -f
           echo here is 3rd exit code %errorlevel%
    )
)exit /b %errorlevel%

上記のコードで私が行っているのは、jar を呼び出し、それが返すエラーレベルに応じて別の exe を呼び出し、その exe のエラーレベルに応じて 3 番目の exe を呼び出すことです。問題は、私が取得している終了コードは最初に割り当てられた終了コードです。つまり、test.jarが2で存在し、他のexeの実行が成功した後でもエラーレベルが変更されない場合です。そして、3 番目の exe は決して実行されません。を呼び出すさまざまなアプローチを試しました

cmd 終了 /b 0

errorlevel を 0 にリセットしますが、機能しません。

4

2 に答える 2

7

あなたの問題は、ステートメントが実行されたときではなく、ステートメントが解析されcmdたときにすぐに環境変数を展開することです。この意味でのステートメントには、ブロックを含む全体が含まれます。遅延展開を使用する必要があるため、バッチの開始時に次を貼り付けます。if

setlocal enabledelayedexpansion

そして、条件ステートメント内の!errorlevel!代わりに使用します (同様に for )。%errorlevel%exitcode

于 2012-07-19T05:19:28.200 に答える
5

最初のIFステートメントに到達すると、%ERRORLEVEL%のすべての出現箇所が、現在の状態に置き換えられます(最初の終了コードと同じ)。

!ERRORLEVEL!を使用します および/または!EXITCODE!遅延拡張を取得して、これらの変数が後で最新の値で拡張されるようにします。

setlocal enabledelayedexpansionこれには、スクリプトの先頭に追加する必要があります。

例えば

@エコーオフ
setlocal enabledelayedexpansion
FOO=fooを設定します
エコー%FOO%
1 == 1の場合(
   FOO=barを設定します
   エコー%FOO%
   エコー!FOO!
)。

生産:

foo
foo
バー
于 2012-07-19T05:23:29.270 に答える