Как использовать переменные в переменных? Этот код:
set newvar=%var%var2%%
не работает. Так что делать? Я не могу написать свою программу без него.
решение1
Я согласен с AFH; вам нужно заставить CMD «двойной разбор» оператора set
. Но я нашел ляп для этого, который не требует временного пакетного файла (или просмотра каждой переменной для поиска нужной). Он использует подпрограмму и трюк, называемый отложенным расширением переменной. Включите отложенное расширение, добавив
setlocal enabledelayedexpansion
где-то около начала вашего пакетного файла. Цель отложенного расширения переменной несколько сложна – см. SET /?
и SETLOCAL /?
для получения дополнительной информации – но важно знать, что это позволяет вам ссылаться на переменные с помощью в дополнение к .!variable_name!
%variable_name%
Итак, начнем:
@echo off
setlocal enabledelayedexpansion
set var1=red
set var2=orange
set var3=yellow
set A=2
call :kludge var%A%
echo Newvar is %newvar%.
goto :eof
:kludge
set newvar=!%1!
exit /b
Когда мы переходим к :kludge
, оператор сначала преобразуется в set newvar=!var2!
(потому что %1
, первый аргумент подпрограммы, это var2
), а затем set newvar=orange
(точно так же, как если бы оператор был set newvar=%var2%
). Поэтому newvar
устанавливается в orange
.
Кстати, goto :eof
и exit /b
взаимозаменяемы. Если они вызваны из подпрограммы (т. е. из места, куда вы попали с помощью оператора call
), они вызывают возврат к вызывающему. В противном случае они действуют как переход к концу пакетного файла, заставляя пакетное задание завершиться, не удаляя родительскую, интерактивную, командную строку.
решение2
Относительно медленный метод. Команда CALL обеспечивает дополнительный уровень расширения переменной. Проценты вокруг имени внешней переменной удваиваются, чтобы задержать расширение до тех пор, пока внутренняя переменная не будет расширена.
@echo off
setlocal
set "var1=value"
set "var2=1"
call set "newvar=%%var%var2%%%"
Гораздо лучший метод — использовать отложенное расширение. Сначала его нужно включить с помощью SETLOCAL ENABLEDELAYEDEXPANSION. Переменная внутри процентов расширяется при разборе строки. Переменная внутри восклицательных знаков расширяется после разбора, непосредственно перед выполнением строки.
@echo off
setlocal enableDelayedExpansion
set "var1=value"
set "var2=1"
set "newvar=!var%var2%!"
решение3
В общем, я бы старался избегать подобных сценариев. Хотя это и возможно, но это далеко не производительно и не очень легко читать — по сути, вам придется разбирать вывод команды set
.
set index=9
set var9=Goal
echo %var9%
for /F "usebackq tokens=1* delims==" %I in (`set`) do if "%I" == "var%index%" set result=%J
echo %result%