Aninhando IF no arquivo Bat do Windows

3

Estou tendo alguma dificuldade em entender como o IF aninhado funciona no script windows .bat. O que desejo alcançar é o seguinte. Vou passar dois parâmetros para um arquivo bat

SE primeiro parâmetro = 0 E se Segundo parâmetro = 0 execute proc1

SE primeiro parâmetro = 0 E segundo não 0 execute proc2

Se o primeiro parâmetro não for 0 run proc 3

O esqueleto do código que escrevi até agora é

@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

O problema é que ele está funcionando bem nas duas primeiras condições, mas quando o primeiro parâmetro é diferente de zero, ele ainda passa pelo proc1, enquanto o esperado é o proc3. O que estou perdendo aqui? O script não apresenta nenhum erro, exceto se os parâmetros forem omitidos em primeiro lugar.

    
por ramki 03.04.2016 / 13:03

2 respostas

2

Não tenho certeza se você precisa de ELSE, muito menos de um IF aninhado, para seu caso de uso:

@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

Se, por algum motivo, você realmente quiser aninhar seus IFs, não terá um colchete:

Seu lote:

IF %1% == 0 (
    IF %2% == 0 ( goto proc1
    ) ELSE ( goto proc2
)
***MISSING )***  ELSE ( goto proc3
)

Lote que deve funcionar:

IF "%1%" == "0" (
    IF "%2%" == "0" ( 
    goto proc1
    ) ELSE ( 
    goto proc2
    )
) ELSE ( 
    goto proc3
)
    
por 03.04.2016 / 13:39
0

O que estou perdendo aqui?

O operador de comparação == sempre resulta em uma comparação string .

Você precisa usar EQU para realizar uma comparação numérica .

Use o seguinte arquivo em lotes:

@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

Notas:

  • Alguns goto :exits s foram adicionados para finalizar o procs em vez de exit , o que encerra o shell cmd .

Exemplo de saída:

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>

Leitura Adicional

por 03.04.2016 / 13:48