Вопрос или проблема
Я как бы просто вижу, что возможно, а что нет, когда делаю пакетные файлы. Я знаю, что это довольно устаревший язык, но очень интересный и все еще очень функциональный.
Я удивлён, что не смог найти ничего, когда пытался это изучить.
Вот мой сценарий:
У меня есть две переменные, одна называется “varname” и содержит строку, другая — “value” и содержит целое число.
Без включенной отложеннойexpansion, как я могу изменить переменную, которая существует в моем скрипте, и имеет то же имя, что и содержимое переменной “varname”, и установить содержимое этой переменной равным содержимому “value”.
Вот небольшой пример, чтобы продемонстрировать мое мышление, давайте скажем, что %%a содержит число 1000, а %%b содержит строку “testvar”:
set "testvar="
<input.txt set /p input=
for /F "tokens=1,2 delims=-" %%a in ("%input%") do (
set value=%%a
set varname=%%b
)
–Что делать дальше?–
set %varname%=%value% ...нет
set %%varname%%=%value% ...тоже нет
set %varname%=%%value%% ...тоже нет
–вызывать set? кавычки? какое волшебное сочетание нужно, чтобы это заработало (если такое существует?)
Чтобы я мог сделать это, и это вернуло 1000:
echo %testvar%
Похоже, вы можете сделать что-то особенное через “call set”, но все примеры, которые я видел, это попытки установить жестко заданное имя переменной с динамическим значением. Ничего не вызывает трудностей, когда у вас включена отложеннаяexpansion, но в данном случае я специально ищу способ без нее. Если это невозможно, хорошо, но я был бы удивлён.
Ответ или решение
Вопрос о динамическом установлении переменной в пакетном файле является интересным и часто встречается среди разработчиков, стремящихся оптимизировать свои скрипты. Рассмотрим подробно, как можно изменить переменную, имя которой хранится в другой переменной, без использования отложенной экспансии.
Ситуация и доступные параметры
Вы имеете две переменные: varname
, которая содержит имя переменной, и value
, которая содержит значение. Например, если varname
равно "testvar", а value
равно 1000, то вы хотите установить переменную testvar
равной 1000. В традиционных пакетных файлах, без использования отложенной экспансии, это может вызвать затруднения.
Ваша логика верна, когда вы ожидаете, что использование set %varname%=%value%
должно сработать, однако данный подход не будет работать, поскольку интерпретатор командной строки Windows выполняет замену переменных до выполнения команд.
Решение без отложенной экспансии
Чтобы решить эту задачу, мы можем использовать команду call
, которая позволяет выполнять команды в контексте новой интерпретации, где переменные могут быть разрешены. Поскольку у вас нет отложенной экспансии, нужно будет использовать следующий подход:
@echo off
setlocal enabledelayedexpansion
:: Инициализация переменных
set "testvar="
set /p input="Введите значения в формате 'число-имя': "
for /F "tokens=1,2 delims=-" %%a in ("%input%") do (
set value=%%a
set varname=%%b
)
:: Использование 'call' для динамического присвоения переменной
call set %%varname%%=%%value%%
:: Для проверки результата
echo Значение переменной testvar: %testvar%
Как это работает?
- Инициализация переменных: Мы создаем переменную
testvar
и запрашиваем ввод данных в необходимом формате. - Разбор ввода: Используя цикл
for
, мы разбираем введенные значения на две части —число
иимя
. - Динамическое присвоение значений: С помощью команды
call
мы создаем новый контекст выполнения, что позволяет интерпретатору правильно обрабатывать ссылки на переменные.
Заключение
Использование команды call
для динамического присвоения значений переменным в пакетных файлах Windows является эффективным решением, когда отложенная экспансия не может быть использована. Этот метод позволяет вам гибко управлять переменными и расширяет возможности пакетных файлов, несмотря на ограничения языка.
Ваша цель достигнута: значение переменной testvar
теперь установлено равным 1000, и вы можете убедиться в этом с помощью команды echo
. Бетонируя свои знания в данной области, вы можете повышать эффективность ваших скриптов и расширять их функциональность.