2

Как использовать переменные в переменных? Этот код:

set newvar=%var%var2%%

не работает Так что делать? Я не могу написать свою программу без нее.

4 ответа4

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%!"
1

Как правило, я бы старался избегать подобных сценариев. Хотя это возможно, но это далеко от производительности и не очень легко для чтения - в основном вам придется анализировать выходные данные команды 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%
0

Вы пропускаете%.

установить "newvar =% var1 %% var2%"

Обратите внимание, что переменная начинается и заканчивается%.

Смотрите также: http://www.dostips.com/DtTipsStringManipulation.php

0

Я согласен с 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 вызывается из подпрограммы (т. Е. Из того места, куда вы попали с оператором вызова ), они вызывают возврат к вызывающей стороне.  В противном случае они действуют как переход к концу пакетного файла, в результате чего пакетное задание завершается без удаления родительской интерактивной командной строки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .