Как использовать переменные в переменных? Этот код:
set newvar=%var%var2%%
не работает Так что делать? Я не могу написать свою программу без нее.
Как использовать переменные в переменных? Этот код:
set newvar=%var%var2%%
не работает Так что делать? Я не могу написать свою программу без нее.
Относительно медленный метод. Команда 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%!"
Как правило, я бы старался избегать подобных сценариев. Хотя это возможно, но это далеко от производительности и не очень легко для чтения - в основном вам придется анализировать выходные данные команды 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%
Вы пропускаете%.
установить "newvar =% var1 %% var2%"
Обратите внимание, что переменная начинается и заканчивается%.
Смотрите также: http://www.dostips.com/DtTipsStringManipulation.php
Я согласен с 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
вызывается из подпрограммы (т. Е. Из того места, куда вы попали с оператором вызова ), они вызывают возврат к вызывающей стороне.
В противном случае они действуют как переход к концу пакетного файла, в результате чего пакетное задание завершается без удаления родительской интерактивной командной строки.