與您的代碼的主要問題是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
該行的其餘部分(變量中的值)
啊哈!你的第一個例子就是我正在尋找的東西!非常感謝你!當我最初嘗試使用table1而不是%table1%的FOR循環時,SET工作但IF沒有。 !%%X!解決了這個問題。 – user3768793