¿Las variables en el archivo por lotes no se establecen cuando están dentro de IF?
Tengo dos ejemplos de archivos batch muy sencillos:
Asignando un valor a una variable:
@echo off
set FOO=1
echo FOO: %FOO%
pause
echo on
Que, como es de esperar, da como resultado:
FOO: 1
Press any key to continue . . .
Sin embargo, si coloco las mismas dos líneas dentro de un bloque IF NOT DEFINED:
@echo off
IF NOT DEFINED BAR (
set FOO=1
echo FOO: %FOO%
)
pause
echo on
Esto inesperadamente resulta en:
FOO:
Press any key to continue . . .
Esto no debería_ tener nada que ver con el IF, claramente el bloque se está ejecutando. Si defino BAR por encima del if, sólo se muestra el texto del comando PAUSE, como es de esperar.
¿Qué pasa?
- *
Pregunta de seguimiento: ¿Hay alguna forma de activar la expansión retardada sin setlocal?
Si llamara a este sencillo archivo batch de ejemplo desde dentro de otro, el ejemplo establece FOO, pero sólo LOCALMENTE.
Por ejemplo:
testcaller.bat
@call test.bat
@echo FOO: %FOO%
@pause
test.bat
@setlocal EnableDelayedExpansion
@IF NOT DEFINED BAR (
@set FOO=1
@echo FOO: !FOO!
)
Esto muestra:
FOO: 1
FOO:
Press any key to continue . . .
En este caso, parece que tengo que habilitar la expansión retardada en el CALLER, lo que puede ser una molestia.