Variáveis em ficheiro de lote não sendo definidas quando dentro de IF?
Tenho dois exemplos de ficheiros de lotes muito simples:
Atribuição de um valor a uma variável:
@echo off
set FOO=1
echo FOO: %FOO%
pause
echo on
O que, como esperado, resulta em
FOO: 1
Press any key to continue . . .
Contudo, se eu colocar as mesmas duas linhas dentro de um bloco SE NÃO DEFINIDO:
@echo off
IF NOT DEFINED BAR (
set FOO=1
echo FOO: %FOO%
)
pause
echo on
Isto unexpectedly resulta em:
FOO:
Press any key to continue . . .
Este não deve_ ter nada a ver com o FI, claramente o bloco está a ser executado. Se eu definir BAR acima do if, apenas o texto do comando PAUSE é exibido, como esperado.
O que dá?
Pergunta de seguimento: Existe alguma forma de permitir a expansão retardada sem setlocal?
Se eu chamasse a este simples exemplo ficheiro de lote a partir de dentro de outro, o exemplo define FOO, mas apenas LOCALMENTE.
Por exemplo:
testcaller.bat
@call test.bat
@echo FOO: %FOO%
@pause
test.bat
@setlocal EnableDelayedExpansion
@IF NOT DEFINED BAR (
@set FOO=1
@echo FOO: !FOO!
)
Isto mostra:
FOO: 1
FOO:
Press any key to continue . . .
Neste caso, parece que tenho de permitir uma expansão retardada no CALLER, o que pode ser um incómodo.