Tengo dos ejemplos de archivos por lotes muy simples:
Asignación de un valor a una variable:
@echo off
set FOO=1
echo FOO: %FOO%
pause
echo on
Lo cual, como se esperaba, da como resultado:
FOO: 1
Press any key to continue . . .
Sin embargo, si coloco las mismas dos líneas dentro de un bloque SI NO ES DEFINIDO:
@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 encima del if, solo se muestra el texto del comando PAUSE, como se esperaba.
¿Lo que da?
Pregunta de seguimiento: ¿Hay alguna forma de habilitar la expansión retrasada sin setlocal?
Si tuviera que llamar a este simple archivo por lotes de ejemplo desde otro, el ejemplo establece FOO, pero solo 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 retrasada en el LLAMADOR, lo que puede ser una molestia.
!
, use^^^!
(escape dos veces). De lo contrario, la función de "expansión retrasada" se lo comerá.