批量FOR循环IF和SET冲突

时间:2014-06-23 19:50:27

标签: batch-file

所以,我正在编写一个小型的批处理文件游戏,并在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
)
)

2 个答案:

答案 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=emptyfor循环遍历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行的其余部分(变量中的值)