2014-06-23 61 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