バッチで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で何かになることがありますか?
ありがとうございます!
うーんを使用します! 'マークが機能します。 これは何で、なぜですか? – Nepo
@Nepo - 遅延拡張の仕組みです。 '%'を使用している場合、delayedExpansionがオンになっていても、通常の拡張で変数が展開されます。遅延拡張された変数にアクセスするには、 'setlocal enableDelayedExpansion'と'% 'の代わりに'! 'が必要です – npocmaka
そしてなぜerrorlevelの最初の使用のために!マークは%のisnteadですか? – Nepo