3

У меня возникли некоторые трудности в понимании того, как Nested IF работает в сценарии Windows .bat. То, что я хочу достичь, заключается в следующем. Я передам два параметра в файл bat

ЕСЛИ первый параметр = 0 И если Второй параметр = 0, запустите proc1

ЕСЛИ первый параметр = 0 И второй, а не 0, запустить proc2

ЕСЛИ первый параметр не равен 0, запустите 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

Проблема в том, что он работает нормально для первых двух условий, но когда первый параметр ненулевой, он все равно падает через proc1, тогда как ожидаемый - proc3. Что мне здесь не хватает? Скрипт не выдает никакой ошибки, кроме случаев, когда параметры опущены в первую очередь.

2 ответа2

2

На самом деле я не уверен, что вам нужен ELSE, не говоря уже о вложенном IF, для вашего случая использования:

@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
)
0

Что мне здесь не хватает?

Оператор сравнения == всегда приводит к сравнению строк .

Вам нужно использовать 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

Заметки:

  • Некоторые goto :exits s были добавлены для завершения проков вместо exit который завершает оболочку cmd .

Пример вывода:

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>

Дальнейшее чтение

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .