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