首次发布,请耐心等待。 我正在尝试如下创建.bat文件
set a=file
set b=3
set file3=success
SETLOCAL ENABLEDELAYEDEXPANSION
echo %%a%!b!%
我希望它将解析为“ echo%file3%”,然后打印“成功”。希望对如何达到预期结果提供指导。如果有人可以解释实际发生的情况,我也将不胜感激。
答案 0 :(得分:0)
您要使用delayExpansions进行的操作是先扩展一个变量。首先应扩展的一个是%percentages%中的一个,应延迟扩展的一个是在!exclamationMarks中! (只能在启用delayExpansion的情况下使用)。
因此,您必须先扩展a和b-> %a%%b%
,然后再扩展两者的值-> !file3!
组合:echo !%a%%b%!
答案 1 :(得分:0)
对此,我称之为嵌套变量,重要的是嵌套变量需要在外部变量之前进行替换/扩展。变量a
和b
是我认为是内部变量,file3
是外部变量。
因此,使用delayed expansion,我们有两个扩展阶段可用:正常或立即扩展(%
)和延迟扩展(!
)。按照上述顺序应用它们,解决方案如下:
echo !%a%%b%!
因此,首先,%a%
被扩展为file
,%b%
被扩展为3
,因此延迟扩展阶段接收到!file3!
。
还有一种避免延迟扩展的方法:使用call
,它引入另一个解析阶段,在该阶段重复立即扩展。代码如下:
call echo %%%a%%b%%%
因此,在第一个正常扩展阶段,%%
被文字%
取代,%a%
被扩展为file
,%b%
被扩展为{{1} },其余的3
再次被%%
取代;因此,我们剩下了%
,由于%file3%
,上述第二个解析阶段对其进行了扩展。
以上两种方法均隐含内部变量的正常扩展,例如,当在带括号的代码块(例如循环)中更改内部变量时,可能会引起问题。为了避免正常扩展,我们可以使用for
loop元变量,该变量比常规扩展晚但在延迟扩展之前进行扩展:
call
或者:
for %%I in ("!a!!b!") do echo !%%~I!
由于此处未使用立即扩展,因此即使更改了变量for /F "delims=" %%I in ("!a!!b!") do echo !%%I!
和for
,这也将在另一个a
循环中起作用。