Batch file 循环IF批处理和设置冲突
所以,我在写一个小批量文件游戏,在FOR循环中遇到了这个问题。 这是我代码的一小部分。 如果玩家捡起石头,检查它是否在桌子上,然后把它放在你的背包里。 问题是SET命令不起作用。 我猜行的执行方式是:set%table1%=empty,而不是:set table1=empty 我觉得这个问题有一个简单的解决办法,我在业余时间尝试了几天,但都没有得到。 感谢您的帮助Batch file 循环IF批处理和设置冲突,batch-file,Batch File,所以,我在写一个小批量文件游戏,在FOR循环中遇到了这个问题。 这是我代码的一小部分。 如果玩家捡起石头,检查它是否在桌子上,然后把它放在你的背包里。 问题是SET命令不起作用。 我猜行的执行方式是:set%table1%=empty,而不是:set table1=empty 我觉得这个问题有一个简单的解决办法,我在业余时间尝试了几天,但都没有得到。 感谢您的帮助 set take=rock set table1=box set table2=rock set table3=wrench fo
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=%%x
goto tableRoom
)
)
您现在可以使用计数器来确定您在
FOR
循环中测试的表,并
直接设置表格!N代码>为空:
set take=rock
set table1=box
set table2=rock
set table3=wrench
setlocal enabledelayedexpansion
set $c=1
for %%x in (%table1% %table2% %table3%) do (
if %%x==%take% (
set table!$c!=empty
set pack=%%x
goto tableRoom
)
set /a $c+=1
)
:tableroom
echo table2 is now : %table2%
代码的主要问题是set%%x=empty
,这是一个逻辑原因:for
循环在表
变量内的值列表上迭代,而不是在变量名称上迭代,因此在没有变量引用时,无法更改变量的值,你有内在的价值
启用延迟扩展和迭代变量名称可以解决问题
@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执行代码>时,它将类似于!表1代码>,检索变量内的值(启用延迟扩展时)
如果所用变量(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
行的其余部分(变量中的值)我喜欢这个想法,它大胆地解决了这个问题。非常感谢。但是有没有一个简单的方法可以得到:如果%%x==whater和设置%%x=whater都在同一个FOR循环中工作,我觉得这会限制我继续前进。啊哈!你的第一个例子就是我要找的!非常感谢你!当我最初尝试使用table1而不是%table1%进行FOR循环时,SET有效,但如果无效的话。!%x!解决了这个问题。