从一个不那么曲折的解决方案的角度思考,这也产生了CCC
你渴望。
setlocal enabledelayedexpansion
set AAA=BBB
set BBB=CCC
for /F %%a in ('echo %AAA%') do echo !%%a!
edit:
剖析这个答案:
setlocal enabledelayedexpansion
- 这将允许在您的bat过程中使用任何环境变量设置,并在您的过程中进行修改for
loop.
set AAA=BBB
, set BBB=CCC
- 您的数据群体set
声明
for /F %%a in ('echo %AAA%') do echo !%%a!
- 这告诉处理器循环,尽管只循环一次,并取出从运行括号中的命令返回的第一个标记(空格和制表符的默认分隔符)并将其放入 var %%a (外部)对于一批,单个 % 即可)。如果您将该 var 指定为 %%a,则需要在您的代码中使用 %%ado
堵塞。同样,如果您指定 %%i,请在您的do
堵塞。请注意,要使您的环境变量在do
块的for
循环,你需要将它包围在!
的。 (你不需要在in
块,正如我最初发布的那样 - 我在编辑中进行了更改)。
edit:
您与更新后的示例非常接近。试试这样:
@echo off
setlocal enabledelayedexpansion
set LIST=BBB CCC DDD
set BBB=111
set CCC=222
set DDD=333
for %%i in (%LIST%) do (
for /F %%a in ('echo %%i') do echo !%%a!
)
您的更新与此之间的区别在于您试图回显环境变量in
设置为in ('echo %%%i%')
,但没有!
用于设置变量的延迟扩展。你是否使用in ('echo !%%i!')
,你会看到你的BBB
, CCC
, and DDD
变量解决了,但随后do
你的内部循环块没有任何需要解决的问题 - 你没有任何问题111
环境变量。考虑到这一点,您可以通过以下方式简化循环:
@echo off
setlocal enabledelayedexpansion
set LIST=BBB CCC DDD
set BBB=111
set CCC=222
set DDD=333
for %%i in (%LIST%) do (echo !%%i!)