Batch file 循环IF批处理和设置冲突

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

所以,我在写一个小批量文件游戏,在FOR循环中遇到了这个问题。 这是我代码的一小部分。 如果玩家捡起石头,检查它是否在桌子上,然后把它放在你的背包里。 问题是SET命令不起作用。 我猜行的执行方式是:set%table1%=empty,而不是: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
)
)

您现在可以使用计数器来确定您在
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!解决了这个问题。