![批次檔。變數中的變數](https://rvso.com/image/1413962/%E6%89%B9%E6%AC%A1%E6%AA%94%E3%80%82%E8%AE%8A%E6%95%B8%E4%B8%AD%E7%9A%84%E8%AE%8A%E6%95%B8.png)
如何在變數中使用變數?這段程式碼:
set newvar=%var%var2%%
不起作用。那該怎麼辦?沒有它我就無法寫程式。
答案1
我同意 AFH 的觀點;你需要讓 CMD 來「雙重解析」該set
語句。但我發現了一種不涉及臨時批次檔(或查看每個變數以找到所需變數)的拼湊方法。它使用一個子例程和一個稱為延遲變數擴展的技巧。透過新增啟用延遲擴展
setlocal enabledelayedexpansion
靠近批次檔開頭的某個位置。延遲變數擴充的目的有些複雜 - 請參閱SET /?
和SETLOCAL /?
了解更多資訊 - 但要知道的重要一點是,它允許您使用 in 和來引用變數。!variable_name!
%variable_name%
那我們就開始吧:
@echo off
setlocal enabledelayedexpansion
set var1=red
set var2=orange
set var3=yellow
set A=2
call :kludge var%A%
echo Newvar is %newvar%.
goto :eof
:kludge
set newvar=!%1!
exit /b
當我們跳到 時:kludge
,該語句首先被轉換為set newvar=!var2!
(因為 %1
,子程式的第一個參數是var2
),然後set newvar=orange
(就像該語句被轉換為 一樣set newvar=%var2%
)。所以newvar
設定為orange
.
順便說一句,goto :eof
和exit /b
是可以互換的。如果從子程式內呼叫(即,您必須使用語句到達的某個地方call
),它們會導致返回到呼叫者。否則,它們就像跳到批次檔末尾一樣,導致批次作業終止,而不會破壞父互動式命令提示字元。
答案2
一種相對較慢的方法。 CALL 指令提供了額外層級的變數擴充。外部變數名稱周圍的百分比加倍,以延遲擴展,直到內部變數擴展之後。
@echo off
setlocal
set "var1=value"
set "var2=1"
call set "newvar=%%var%var2%%%"
更好的方法是使用延遲擴展。必須先使用 SETLOCAL ENABLEDELAYEDEXPANSION 啟用它。解析該行時,百分比內的變數會擴展。感嘆號內的變數在解析後、執行該行之前展開。
@echo off
setlocal enableDelayedExpansion
set "var1=value"
set "var2=1"
set "newvar=!var%var2%!"
答案3
一般來說,我會盡量避免這樣的情況。雖然這是可能的,但它的性能還很差,而且不太容易閱讀——基本上你必須解析命令的輸出set
。
set index=9
set var9=Goal
echo %var9%
for /F "usebackq tokens=1* delims==" %I in (`set`) do if "%I" == "var%index%" set result=%J
echo %result%