Pregunta

¿Qué mostrará el siguiente segmento de código de archivo .bat de DOS? ¿Por qué? (es decir, ¿por qué no se comporta como podría pensarlo primero)?

establece VAR = antes

si "% VAR% " == " antes de " (

establece VAR = después;

echo% VAR%

)

[Sé la respuesta a esto, pero lo calculé lo suficientemente valioso como para publicar]

¿Fue útil?

Solución

Obviamente, usted pensaría que la salida sería " después de " ;, dado que restablecemos la variable env dentro del bucle.

Pero la salida será " antes de " ;. La razón es que el intérprete realiza la sustitución de variables en los archivos .bat cuando se lee un comando, en lugar de cuando se ejecuta. Por lo tanto, para la declaración compuesta, las variables en el cuerpo se evalúan cuando se encuentra por primera vez la instrucción if.

Puede hacer que esto funcione utilizando la expansión de la variable de entorno retrasada (es necesario habilitarla). Si está habilitado, puedes hacer:

establece VAR = antes

si "% VAR% " == " antes de " (

establece VAR = después;

echo! VAR!

)

Puede habilitar la expansión de la variable de entorno retrasada usando la opción / v al iniciar cmd.exe.

[Backstory: muchos de nosotros todavía usamos archivos .bat heredados para manejar procedimientos como hacer procedimientos, etc. Obviamente hay mejores herramientas de scripting, pero no siempre hay una opción para usarlos. Me encontré con este problema hace un tiempo y recientemente encontré a otras dos personas que se habían sacado el pelo por la misma cosa. Por lo tanto, es útil comprender cómo el intérprete realiza la sustitución de variables].

Otros consejos

La sustitución por% VAR% ocurre antes de la ejecución del comando. Aunque hay varios comandos distribuidos en varias líneas, la agrupación de ellos en parens (...) hace que el analizador cmd.exe lea todo el contenido como un solo comando. Entonces, lo que se ejecuta se ve así:

set VAR=before

if "before" == "before" (

set VAR=after;

echo before

)

al intérprete.

Esta es una de las muchas cosas que hacen que el procesamiento de archivos por lotes sea bastante doloroso cuando la mujer intenta hacer algo más que cosas simples.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top