批次檔。變數中的變數

批次檔。變數中的變數

如何在變數中使用變數?這段程式碼:

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 :eofexit /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%

相關內容