2014-06-23 62 views
0

因此,我正在编写一个小批量文件游戏,并在FOR循环中遇到了这个问题。 这是我的一小部分代码。 如果玩家拿起磐石,检查它是否放在桌子上,然后放入包中。 问题是SET命令不起作用。 我想那行代码执行如下:set%table1%= empty not:set table1 = empty。批量FOR循环IF和SET冲突

我觉得这个问题有一个简单的解决方案,我在业余时间尝试了几天,但没有得到它。 任何帮助表示赞赏!

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

与您的代码的主要问题是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该行的其余部分(变量中的值)

+0

啊哈!你的第一个例子就是我正在寻找的东西!非常感谢你!当我最初尝试使用table1而不是%table1%的FOR循环时,SET工作但IF没有。 !%%X!解决了这个问题。 – user3768793

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% 
+0

我喜欢这个想法,并且它明确地解决了这个问题。谢谢!但有没有一种简单的方法来获得:if %% x == whatever以及set %% x =无论在同一个FOR循环中工作,我都觉得这样会限制我进一步走下去。 – user3768793