
set var1=Demo
set var2=%var1%
echo %var2%
rem Output:Demo
Почему set var2
нижеприведенное не работает, если находится в одной строке с set var1
?
set var1=& set var2=
set var1=Demo& set var2=%var1%
echo %var2%
rem output:%var1%
Как я могу сделать set var2
это var1
в одну строку?
решение1
Почему не работает set var2
, если в одной строке с set var1
?
Какharrymcуказывает на то:
Подстановка переменной выполняется во всей командной строке до ее выполнения. В этот момент переменная
var1
еще не определена.
Обойти это ограничение можно с помощью отложенного расширения:
@echo off
setlocal enabledelayedexpansion
set var1=Demo & set var2=!var1!
echo %var2%
endlocal
Пример:
F:\test>test
Demo
Дальнейшее чтение
- Алфавитный указатель командной строки Windows CMD | SS64.com
- Команды Windows CMD (категоризированные) - Windows CMD - SS64.com
- парсинг - Как интерпретатор команд Windows (CMD.EXE) анализирует скрипты? - Stack Overflow
- EnableDelayedExpansion - Windows CMD - SS64.com
- Endlocal - Локальные переменные среды - Windows CMD - SS64.com
- Setlocal - Локальные переменные - Windows CMD - SS64.com
решение2
Подстановка переменной выполняется во всей командной строке до ее выполнения. В этот момент переменная var1
еще не определена.
Правила подстановки неопределенной переменной следующие:
- Если переменная введена интерактивно, то замена не производится и текст остается таким же.
%var1%
- При использовании в пакетном файле переменная заменяется пустой строкой.
Вам нужно разбить эту однострочную строку на две, чтобы var1
иметь значение. Или см. ответ @DavidPostill.
решение3
Это можно сделать без использования отложенного расширения (без « setlocal enabledelayedexpansion
»), используя «for» (цикл) с «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
Выход:
var1=[], var2=[]
var1=[Demo], var2=[Demo]
Вы даже можете добавить второй цикл «for» для выполнения «echo var2» в той же строке:
: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
«Окончательный» вывод:
var2=[Demo]
Вот разбивка «for» и «call»:
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.