BAT文件:变量内容作为另一个变量的一部分

Ale*_*ets 5 variables batch-file

假设我有变量a与内容" 123 "和变量b123与其中的一些文本.出于某种原因,我想使用变量a作为第二个var名称的一部分.像这样的东西:

SET a=123
SET b123=some_text_in_it
rem i want next line to output  "some_text_in_it"
echo %b%a%%
Run Code Online (Sandbox Code Playgroud)

所以我想将文本与var内容连接起来,并使用结果字符串作为变量名称来回显该内容.上面的示例不起作用,我明白为什么,可能我需要添加一些灌浆.怎么做,最好在一条线上?

jeb*_*jeb 8

这有两种常用的方法
CALLDelayedExpansion

setlocal EnableDelayedExpansion
SET a=123
SET b123=some_text_in_it
rem i want next line to output  "some_text_in_it"
call echo %%b%a%%%
echo !b%a%!
Run Code Online (Sandbox Code Playgroud)

CALL变体使用的事实是,一个调用将第二次重新分析该行,第一次只会%a%扩展并且double %%将被缩减为单个%
call echo %b123%
而在第二步%b123%中将扩展.
CALL技术速度慢且不太安全,因此应优先考虑延迟扩展.

DelayedExpansion在感叹号在稍后的解析器阶段中扩展而不是百分比的扩展时起作用.
这也是原因,为什么延迟扩张更加安全.

编辑:包含数字的数组的方法
如果您使用仅包含数字的数组,您也可以使用它set /a来访问它们.
这比技术FORCALL技术要容易得多,它也可以在块中运行.

setlocal EnableDelayedExpansion
set arr[1]=17
set arr[2]=35
set arr[3]=77
(
  set idx=2
  set /a val=arr[!idx!]
  echo !var!
)
Run Code Online (Sandbox Code Playgroud)