web-dev-qa-db-ja.com

Windows BatファイルのIFのネスト

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です。ここで何が欠けていますか?最初にパラメーターが省略されている場合を除いて、スクリプトはエラーを出しません。

6
ramki

ユースケースでネストされた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
)
5
Jonno

ここで何が欠けていますか?

==比較演算子は常に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 :exitssが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>

参考文献

0
DavidPostill