Archivos por lotes de Windows: ¿qué significa expansión de variables y qué significa EnableDelayedExpansion?

¿Qué se entiende por “expansión variable”? ¿Significa simplemente “definición variable”, o algo más?

¿Qué sucede cuando digo setLocal EnableDelayedExpansion ? Google no estaba claro.

  • La expansión variable significa reemplazar una variable encerrada en % o ! por su valor
  • La expansión %normal% ocurre una sola vez , antes de que se ejecute una línea. Esto significa que una %variable% expansión tiene el mismo valor, no importa si la línea se ejecuta varias veces (como en un comando for ).
  • El !delayed! la expansión se realiza cada vez que se ejecuta la línea.

Mira este ejemplo:

 @echo off setlocal EnableDelayedExpansion set "var=Original" set "var=New" & echo Normal: "%var%", Delayed: "!var!" 

Salida:

 Normal: "Original", Delayed: "New" 

Otro:

 @echo off setlocal EnableDelayedExpansion set "var1=Normal" set "var2=Delayed" for /L %%i in (1,1,10) do ( set "var1=%var1% %%i" set "var2=!var2! %%i" ) echo Normal: "%var1%" echo Delayed: "%var2%" 

Salida:

 Normal: "Normal 10" Delayed: "Delayed 1 2 3 4 5 6 7 8 9 10" 

La expansión normal no es necesariamente una desventaja, sino que depende de la situación específica en que se use. Por ejemplo, en cualquier otro lenguaje de progtwigción, para intercambiar el valor de dos variables necesita la ayuda de un tercero, pero en Batch se puede hacer en una sola línea:

 set "var1=%var2%" & set "var2=%var1%" 

En las variables de lote, se expanden al encerrarlas en signos de porcentaje.

 set myVariable=Hello world echo %myVariable% 

Eso significa expansión variable.

Comparado con otros lenguajes de progtwigción, el lote realmente no funciona con variables.
Normalmente funciona solo con la expansión de ellos.
Funciona como la expansión macro de C / C ++.

Entonces, no existe una función de longitud de cadena para obtener la longitud de una variable,
pero puede escribir una función que cuente los caracteres del texto.

Explicación de setLocal EnableDelayedExpansion
El porcentaje de expansión normal tiene dos desventajas.

La expansión ocurre en el momento del análisis de una línea o un bloque entre paréntesis, no cuando se ejecuta el bloque.

Veamos esta muestra

 set var=one set var=two & echo %var% echo %var% 

La salida será

uno
dos

A medida que el echo %var% se expandirá antes de que se ejecute el set var=two . Esto puede ser problemático en los bucles FOR.

Y la segunda desventaja es que el analizador de lotes analizará el resultado expandido de la variable.

 set var=cat^&dog echo %var% 

var
Comando desconocido “perro”

Pero la expansión porcentual existe desde el comienzo de MS-Dos (1920 o más).

¡DelayedExpansion agrega un nuevo personaje de expansión, el signo de exclamación ! .

Pero primero tiene que setlocal EnableDelayedExpansion para usarlo con setlocal EnableDelayedExpansion , esto es por razones de compatibilidad con progtwigs antiguos.

 setlocal EnableDelayedExpansion set var=one set var=two & echo !var! set var=cat^&dog echo !var! 

dos
gato perro

Entonces esto resuelve ambos problemas del porcentaje de expansión.