问题描述
使用Windows XP CMD命令行,我可以按如下所示两次扩展变量:
Using the Windows XP CMD command-line I can expand a variable twice as follows:
set AAA=BBB
set BBB=CCC
for /F "usebackq tokens=*" %i in (`echo %%AAA%%`) do echo %i
将回显CCC
. IE. AAA
已扩展为字符串BBB
,然后变量BBB
已扩展为CCC
.
will echo CCC
. I.e. AAA
has been expanded to the string BBB
, and then the variable BBB
has been expanded to CCC
.
这在批处理脚本(即.cmd文件)中不起作用.将%%AAA%%
更改为%%%AAA%%%
或%%%%AAA%%%%
也不起作用.
This doesn't work from inside a batch script (i.e. a .cmd file). Changing the %%AAA%%
to either %%%AAA%%%
or %%%%AAA%%%%
doesn't work either.
有什么想法可以从脚本中实现,也就是将变量AAA扩展为字符串CCC吗?
Any idea how i can achieve this from within a script, namely to take expand the variable AAA to the string CCC?
最新修改
发布的答案适用于我的简化示例,但是非曲折的答案不适用于实际案例.这是一个扩展的示例(不起作用),它说明了我实际上在尝试执行的操作:
The answers posted work for my reduced example however the non-tortuous answer doesn't work for the real case. Here's an extended example (which doesn't work), which illustrates what I was actually trying to do:
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
输出.
推荐答案
从不太曲折的解决方案角度考虑,这也会产生您想要的CCC
.
Thinking in terms of a less tortuous solution, this, too, produces the CCC
you desire.
setlocal enabledelayedexpansion
set AAA=BBB
set BBB=CCC
for /F %%a in ('echo %AAA%') do echo !%%a!
剖析此答案:
setlocal enabledelayedexpansion
-这将允许您在蝙蝠期间的任何环境变量设置在您的for
循环过程中进行修改.
setlocal enabledelayedexpansion
- this will allow for any environment variable setting during your bat to be used as modified during the process of your for
loop.
set AAA=BBB
,set BBB=CCC
-您的数据填充set
语句
set AAA=BBB
, set BBB=CCC
- your data population set
statements
for /F %%a in ('echo %AAA%') do echo !%%a!
-这告诉处理器循环(尽管只有一次),并从括号中的命令运行中取出返回的第一个令牌(默认的空格和制表符定界符),并将其放入var %% a(在批处理之外,一个%即可).如果将var指定为%% a,则需要在do
块中使用%% a.同样,如果指定%% i,则在do
块中使用%% i.请注意,要在for
循环的do
块中解析环境变量,您需要将其包围在!
中. (您不需要像我最初发布的那样在in
块中进行更改-我已经在编辑中进行了更改).
for /F %%a in ('echo %AAA%') do echo !%%a!
- This tells the processor to loop, albeit only once, and take out the first token that is returned (default delimiter of space and tab apply) from the running of the command in the parens and put it in the var %%a (outside of a batch, a single % will do). If you specify that var as %%a, you need to use %%a in your do
block. Likewise, if you specify %%i, use %%i in your do
block. Note that to get your environment variable to be resolved within the do
block of the for
loop, you need surround it in !
's. (you don't need to in the in
block, as I originally posted - I have made that change in my edit).
您与更新后的示例非常接近.像这样尝试:
You were very close with your updated example. Try it like this:
@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 ('echo %%%i%')
设置的in
中的环境变量,但没有使用!
来延迟设置变量的扩展.如果使用in ('echo !%%i!')
,您会看到BBB
,CCC
和DDD
变量已解析,但是内部循环的do
块将无任何解析-您没有任何环境变量.考虑到这一点,您可以使用以下方法简化循环:
The difference between your update and this is that you were trying to echo the environment variable in the in
set with in ('echo %%%i%')
, but without the !
's for the delayed expansion of set variables. Were you to use in ('echo !%%i!')
, you would see your BBB
, CCC
, and DDD
variables resolved, but then the do
block of your inner loop wouldnt have anything to resolve - you dont have any 111
environment variables. With that in mind, you could simplify your loop with the following:
@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!)
这篇关于如何两次展开CMD Shell变量(递归)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!