Establecer variable en un lote de una línea

Establecer variable en un lote de una línea
set var1=Demo
set var2=%var1%
echo %var2%
rem Output:Demo

¿Por qué set var2a continuación no funciona si está en la misma línea set var1?

set var1=& set var2=
set var1=Demo& set var2=%var1%
echo %var2%
rem output:%var1%

¿Cómo puedo set var2desde var1una línea?

Respuesta1

¿Por qué no funciona set var2si está en la misma línea set var1?

ComoharrymcSeñala:

La sustitución de variables se realiza en toda la línea de comandos antes de ejecutar la línea. En ese momento, la var1variable aún no está definida.

Puede sortear esta limitación utilizando la expansión retrasada:

@echo off
setlocal enabledelayedexpansion
set var1=Demo & set var2=!var1!
echo %var2%
endlocal

Ejemplo:

F:\test>test
Demo

Otras lecturas

Respuesta2

La sustitución de variables se realiza en toda la línea de comandos antes de ejecutar la línea. En ese momento, la var1variable aún no está definida.

Las reglas para una sustitución de variable indefinida son:

  • Si la variable se ingresa interactivamente, no se realiza ninguna sustitución y el texto permanece como%var1%
  • Si se usa en un archivo por lotes, la variable se reemplaza por una cadena nula.

Debes dividir este resumen en dos líneas para que var1 tenga un valor. O vea la respuesta de @DavidPostill.

Respuesta3

Puedes hacer esto sin usar Expansión retardada (sin " setlocal enabledelayedexpansion"), usando un "for" (bucle) con "call".

@echo off
set "var1=" & set "var2="
echo var1=[%var1%], var2=[%var2%]

:rem The one-liner: 
set "var1=Demo" & for /f "usebackq delims=" %%a in (`call echo ^%var1^%`) do @set "var2=%%a"
:: 

echo var1=[%var1%], var2=[%var2%]
:end

La salida:

var1=[], var2=[]
var1=[Demo], var2=[Demo]

Incluso puedes agregar un segundo bucle "for" para hacer el "echo var2" en la misma línea:

:rem The one-liner: 
set "var1=Demo" & for /f "usebackq delims=" %%a in (`call echo ^%var1^%`) do @set "var2=%%a" & for /f "usebackq delims=" %%a in (`call echo var2^=[^%var2^%]`) do @echo %%a
:: 
:end

La salida "final":

var2=[Demo]

Aquí está el desglose de "para" y "llamar":

for /f "usebackq" %%a    Operates on a command that is enclosed in `backquotes`. 
                         Executes that command and captures the output of that 
                         command into variable %%a. 

"delims="                Disables all delimiters when parsing the command 
                         output. Default delimiters are "space" and "tab". 
                         Not required for this specific example. 
                         Used when the command output might contain delimiters. 

(`call echo ^%var1^%`) 
(`call echo var2^=[^%var2^%]`) 
                         Use "call" to execute the echo command within a 
                         separate process. 

                         "^" escapes special characters like "%" and "=" when 
                         the command is read by "for". 

 do @set "var2=%%a" 
 do @echo %%a            Sets the variable "var2" from the output of the 
                         command in the for loop. 


                         In this case, the for command will execute just once. 

                         If the output of the command spanned multiple lines, 
                         the for command would execute once for each non-empty 
                         output line. 

información relacionada