Estoy escribiendo un archivo .bat simple y me he encontrado con un comportamiento extraño. Hay un par de lugares donde tengo que hacer un if/else simple, pero el código dentro de los bloques no parece estar funcionando correctamente.Problema de alcance extraño en el archivo .bat
Aquí es un caso sencillo que muestra el error:
@echo off
set MODE=FOOBAR
if "%~1"=="" (
set MODE=all
echo mode: %MODE%
) else (
set MODE=%~1
echo mode: %MODE%
)
echo mode: %MODE%
La salida que estoy recibiendo es:
C:\>test.bat test
mode: FOOBAR
mode: test
¿Por qué es el eco en el interior del bloque de código no conseguir el nuevo valor de la ¿variable? En el código real que estoy escribiendo necesito construir algunas variables y hacer referencia a ellas dentro del alcance de if/else. Podría cambiar esto para usar etiquetas y gotos en lugar de if/else, pero eso no parece tan limpio.
¿Cuál es la causa de este comportamiento? ¿Hay algún tipo de límite en las variables dentro de los bloques de código?
¿Hay una manera de establecer esa bandera programáticamente en la parte superior de un archivo bat? La mayoría de las veces esto se ejecutará con otro archivo bat, y el entorno en el que se ejecuta no es fijo (se puede hacer doble clic, se puede ejecutar desde un shell cygwin, puede ser de cmd, etc.). – Herms
@Herms, "setlocal enabledelayedexpansion" al inicio, "endlocal" al final. – paxdiablo
Gracias. Esto salvó mi trasero paxdiablo. –