所以,我正在编写一个小型的批处理文件游戏,并在FOR循环中遇到了这个问题。 这是我的一小部分代码。 如果玩家拿起岩石,检查它是否在桌子上,然后将其放入你的包中。 问题是SET命令不起作用。 我猜这些行执行如下:set%table1%= empty not:set table1 = empty。
我觉得这个问题有一个简单的解决方案,我在业余时间尝试了几天,但还没有得到它。 任何帮助表示赞赏!
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
)
)
答案 0 :(得分:0)
您现在可以使用计数器在FOR
循环和/ table!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%
设置为空:
{{1}}
答案 1 :(得分:0)
出于逻辑原因,代码的主要问题是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
行的其余部分(变量中的值)