与您的代码的主要问题是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
该行的其余部分(变量中的值)
啊哈!你的第一个例子就是我正在寻找的东西!非常感谢你!当我最初尝试使用table1而不是%table1%的FOR循环时,SET工作但IF没有。 !%%X!解决了这个问题。 – user3768793