连接两个变量以在MS .bat文件中创建新变量

时间:2018-08-06 14:37:56

标签: batch-file variables

首次发布,请耐心等待。 我正在尝试如下创建.bat文件

set a=file
set b=3
set file3=success
SETLOCAL ENABLEDELAYEDEXPANSION
echo %%a%!b!%

我希望它将解析为“ echo%file3%”,然后打印“成功”。希望对如何达到预期结果提供指导。如果有人可以解释实际发生的情况,我也将不胜感激。

2 个答案:

答案 0 :(得分:0)

您要使用delayExpansions进行的操作是先扩展一个变量。首先应扩展的一个是%percentages%中的一个,应延迟扩展的一个是在!exclamationMarks中! (只能在启用delayExpansion的情况下使用)。

因此,您必须先扩展a和b-> %a%%b%,然后再扩展两者的值-> !file3!

组合:echo !%a%%b%!

答案 1 :(得分:0)

对此,我称之为嵌套变量,重要的是嵌套变量需要在外部变量之前进行替换/扩展。变量ab是我认为是内部变量,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循环中起作用。