Основная проблема с вашим кодом является set %%x=empty
для логическая причина: цикл for
выполняет итерацию по списку значений внутри переменных table
, а не по имени переменных, поэтому вы не можете изменить значение переменной, если у вас нет ссылки на переменную, у вас есть значение внутри Это.
Включение замедленного расширения и итерация имен переменных может решить проблему
@echo off
setlocal enableextensions enabledelayedexpansion
set "take=rock"
set "table1=box"
set "table2=rock"
set "table3=wrench"
for %%x in (table1 table2 table3) do (
if "!%%x!"=="%take%" (
set "%%x=empty"
set "pack=%take%"
goto tableRoom
)
)
:tableRoom
set table
exit /b
%%x
будет содержать имя переменного, поэтому, когда !%%x!
выполняется это будет что-то вроде !table1!
, извлекая значение внутри переменной (когда включено замедленное расширение).
Если имена используемых переменных (table...
) не сталкиваются ни с чем другим, и вы не хотите использовать задержанное расширение, можно взять вывод команды set table
(список переменных со значениями) и обрабатывать этот список с командой for /f
, разделяя вывод команды, отделяя имя переменной и значение
@echo off
setlocal enableextensions disabledelayedexpansion
set "take=rock"
set "table1=box"
set "table2=rock"
set "table3=wrench"
for /f "tokens=1,* delims==" %%a in ('set table') do (
if "%%b"=="%take%" (
set "%%a=empty"
set "pack=%take%"
goto tableRoom
)
)
:tableRoom
set table
exit /b
выход set
команды содержит var=value
. Каждая из линий разделяется с использованием =
в качестве разделителя для получения двух жетонов (tokens=1,*
). %%a
сохранит первый токен (имя переменной) и %%b
остальную часть строки (значение в переменной)
Aha! Ваш первый пример - то, что я искал! Большое спасибо! Когда я изначально пробовал цикл FOR с таблицей 1, а не% table1%, SET работал, но IF не делал этого. !%%Икс! устраняет проблему. – user3768793