Esta é uma peculiaridade do analisador de comandos. Por causa dos colchetes, ele vê tudo de if ...
a )
como uma linha. Quando ele lê essa "linha única", ela expande todas as variáveis para seus valores antes de processar qualquer uma delas. Todos os comandos set
ocorrem após as variáveis terem sido expandidas.
Existem duas soluções: ramificações e exsudação atrasada.
Ramos: Certifique-se de que os comandosset
e echo
não estão no mesmo conjunto de colchetes mais importantes:
@echo off
if not prod==prod goto :end
if xps==xps (
set ...
) else (
set ...
)
if 1==1 (
...
)
:end
pause
Expansão atrasada: Isso faz com que as variáveis sejam expandidas conforme necessário, em vez de antecipadamente. Use o comando SetLocal EnableDelayedExpansion
para ativar este modo, use! marca para se referir a uma variável dessa maneira, e use o comando EndLocal
quando estiver pronto. Note que EndLocal
esquecerá qualquer variável declarada após SetLocal
, então você pode querer mover SetLocal
para depois dos comandos set
.
@echo off
setlocal enabledelayedexpansion
if prod==prod (
if xps==xps (
set i1=prodxpsi1
...
) else (
set i1=prodzpsi1
...
)
if 1==1 (
echo !i1!, !i2!, !e1!, !e2!
) else (
echo !i1!, !i2!, !e1!, !e2!
)
)
endlocal
pause