2017-12-22 15 views
0

バッチでERRORLEVELに問題があります。 2つのコードスニペットを正確な問題に貼り付け、再現性があります。バッチのERRORLEVELが不適切かつ奇妙に動作する

私がここに貼り付けていないのは、遅延拡張で2番目のコードスニペットを試み、%ERRORLEVEL%== 0ではなくIF ERRORLEVEL 0()で最初のコードスニペットを試みたのですが、残念なことに同じ問題が発生しました。このコードをしようとして

まず:

@ECHO OFF 

call :CheckFileExists .\Database.db3 

echo CheckFileExists returned %ERRORLEVEL% 
IF %ERRORLEVEL% == 0 (
    echo First check succeeded 
    call :CheckFileExists .\dummy.txt 

    echo CheckFileExists returned %ERRORLEVEL% 
    IF %ERRORLEVEL% == 0 (
     echo Second check succeeded 
    ) ELSE (
     echo Second check failed 
    ) 
) ELSE (
    echo First check failed 
) 

GOTO :eof 

:CheckFileExists 
IF exist %1 (
    echo INFO: Necessary file exists: %1 
) ELSE (
    echo ERROR: Necessary file missing: %1 
    EXIT /B 1 
) 
EXIT /B 

そしてCMDでの成果:

INFO: Necessary file exists: .\Database.db3 
CheckFileExists returned 0 
First check succeeded 
ERROR: Necessary file missing: .\dummy.txt 
CheckFileExists returned 0 
Second check succeeded 

次私はERRORLEVELを保持するために、各関数呼び出しのための2つの変数を作成したが、以下でそれ失敗を実行していますコード(どこに失敗したかを知るためにエコーを行います):

@ECHO ON 

call :CheckFileExists .\Database.db3 

set error=%ERRORLEVEL% 
echo CheckFileExists returned %error% 
IF %error% == 0 (
    echo First check succeeded 
    call :CheckFileExists .\dummy.txt 
    set error2=%ERRORLEVEL% 
    echo CheckFileExists returned %error2% 
    IF %error2% == 0 (
     echo Second check succeeded 
    ) ELSE (
     echo Second check failed 
    ) 
) ELSE (
    echo First check failed 
) 

GOTO :eof 

:CheckFileExists 
IF exist %1 (
    echo INFO: Necessary file exists: %1 
) ELSE (
    echo ERROR: Necessary file missing: %1 
    EXIT /B 1 
) 
EXIT /B 

これはcmdの結果です:

call :CheckFileExists .\Database.db3 

IF exist .\Database.db3 (echo INFO: Necessary file exists: .\Database.db3) ELSE (
echo ERROR: Necessary file missing: .\Database.db3 
EXIT /B 1 
) 
INFO: Necessary file exists: .\Database.db3 

EXIT /B 

set error=0 

echo CheckFileExists returned 0 
CheckFileExists returned 0 
(was unexpected at this time. 

     IF == 0 (

私は本当にこれに固執しています、誰かが私を助けることができますか?それは機能のEXITで何かになることがありますか?

ありがとうございます!

答えて

2

あなたがdelayed expansionを必要とする:

@ECHO OFF 
setlocal enableDelayedExpansion 
call :CheckFileExists .\Database.db3 

echo CheckFileExists returned %ERRORLEVEL% 
IF %ERRORLEVEL% == 0 (
    echo First check succeeded 
    call :CheckFileExists .\dummy.txt 

    echo CheckFileExists returned !ERRORLEVEL! 
    IF !ERRORLEVEL! == 0 (
     echo Second check succeeded 
    ) ELSE (
     echo Second check failed 
    ) 
) ELSE (
    echo First check failed 
) 

GOTO :eof 

:CheckFileExists 
IF exist %1 (
    echo INFO: Necessary file exists: %1 
) ELSE (
    echo ERROR: Necessary file missing: %1 
    EXIT /B 1 
) 
EXIT /B 

または私はすでに遅れ拡大してみましたが、動作しているようだが、次のERRORLEVELについての変更は "をチェックIF ERRORLEVEL

@ECHO OFF 
call :CheckFileExists .\Database.db3 

echo CheckFileExists returned %ERRORLEVEL% 
IF %ERRORLEVEL% == 0 (
    echo First check succeeded 
    call :CheckFileExists .\dummy.txt 

    call echo CheckFileExists returned %%ERRORLEVEL%% 
    IF ERRORLEVEL 0 IF NOT ERRORLEVEL 1 (
     echo Second check succeeded 
    ) ELSE (
     echo Second check failed 
    ) 
) ELSE (
    echo First check failed 
) 

GOTO :eof 

:CheckFileExists 
IF exist %1 (
    echo INFO: Necessary file exists: %1 
) ELSE (
    echo ERROR: Necessary file missing: %1 
    EXIT /B 1 
) 
EXIT /B 
+0

うーんを使用します! 'マークが機能します。 これは何で、なぜですか? – Nepo

+0

@Nepo - 遅延拡張の仕組みです。 '%'を使用している場合、delayedExpansionがオンになっていても、通常の拡張で変数が展開されます。遅延拡張された変数にアクセスするには、 'setlocal enableDelayedExpansion'と'% 'の代わりに'! 'が必要です – npocmaka

+0

そしてなぜerrorlevelの最初の使用のために!マークは%のisnteadですか? – Nepo

関連する問題