如何将 CMD shell 变量展开两次(递归)

2024-04-10

使用 Windows XP CMD 命令行,我可以将变量展开两次,如下所示:

set AAA=BBB
set BBB=CCC
for /F "usebackq tokens=*" %i in (`echo %%AAA%%`) do echo %i

会回声CCC. I.e. AAA已扩展为字符串BBB,然后变量BBB已扩展到CCC.

这在批处理脚本(即 .cmd 文件)内部不起作用。改变%%AAA%%到任一%%%AAA%%% or %%%%AAA%%%%也不行。

知道如何在脚本中实现此目的,即将变量 AAA 扩展为字符串 CCC?

后期编辑

发布的答案适用于我的简化示例,但非曲折的答案不适用于实际情况。这是一个扩展示例(不起作用),它说明了我实际上想要做的事情:

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!

)

我想看看

111
222
333

output.


从一个不那么曲折的解决方案的角度思考,这也产生了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!)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 CMD shell 变量展开两次(递归) 的相关文章

随机推荐