Nested IFがWindowsの.batスクリプトでどのように機能するかを理解するのが困難です。私が達成したいことは次のとおりです。私は2つのパラメータをbatファイルに渡します
最初のパラメーターが0の場合、かつ2番目のパラメーターが0の場合、proc1を実行します。
IF最初のパラメーター= 0 AND 2番目のパラメーターが0ではない場合、proc2を実行
最初のパラメーターが0でない場合は、proc 3を実行します。
これまでに書いたコードの骨組みは
@echo off
IF %1% == 0 (
IF %2% == 0 ( goto proc1
) ELSE ( goto proc2
)
ELSE ( goto proc3
)
:proc1
echo in Proc1 0 0
pause
exit
:proc2
echo in Proc2 0 N0
pause
exit
:proc3
echo in Proc3 N0 0
pause
exit
問題は、最初の2つの条件では問題なく機能することですが、最初のパラメーターがゼロ以外の場合でも、proc1を介して低下しますが、期待されるのはproc3です。ここで何が欠けていますか?最初にパラメーターが省略されている場合を除いて、スクリプトはエラーを出しません。
ユースケースでネストされたIFはもちろんのこと、ELSEが必要かどうか実際にはわかりません。
@echo off
IF NOT "%1%"=="0" (
goto proc3
)
IF "%2%"=="0" (
goto proc1
)
goto proc2
:proc1
echo in Proc1 0 0
pause
exit
:proc2
echo in Proc2 0 N0
pause
exit
:proc3
echo in Proc3 N0 0
pause
exit
なんらかの理由で本当にIFをネストしたい場合は、括弧が欠けています。
あなたのバッチ:
IF %1% == 0 ( IF %2% == 0 ( goto proc1 ) ELSE ( goto proc2 ) ***MISSING )*** ELSE ( goto proc3 )
動作するはずのバッチ:
IF "%1%" == "0" (
IF "%2%" == "0" (
goto proc1
) ELSE (
goto proc2
)
) ELSE (
goto proc3
)
==
比較演算子は常にstring比較になります。
数値比較を実行するには、代わりにEQU
を使用する必要があります。
次のバッチファイルを使用します。
@echo off
IF NOT %1% EQU 0 (
goto proc3
)
IF %2% EQU 0 (
goto proc1
)
goto proc2
:proc1
echo in Proc1 0 0
pause
goto :exit
:proc2
echo in Proc2 0 N0
pause
goto :exit
:proc3
echo in Proc3 N0 0
pause
:exit
ノート:
exit
シェルを終了するcmd
ではなく、いくつかのgoto :exits
sがprocを終了するために追加されました。出力例:
F:\test>example 0 0
in Proc1 0 0
Press any key to continue . . .
F:\test>example 0 1
in Proc2 0 N0
Press any key to continue . . .
F:\test>example 1 0
in Proc3 N0 0
Press any key to continue . . .
F:\test>