在bat文件中连接变量

时间:2017-10-31 05:21:27

标签: string batch-file cmd concatenation

我创建了名为vk.bat的bat文件。代码如下: -

SET "tcs="

FOR %%A IN (%*) DO (
      Set "tcs=%tcs% -t %%A"      
)
Echo %tcs%

我正在从cmd执行这个bat,如下所示: -

c:\vk.bat Apple Cat Play

我希望最终字符串为" -t Apple -t Cat -t Play"

但我得到的最终字符串是“-t Play”。我无法找出为什么以及如何覆盖字符串tcs的先前内容。

2 个答案:

答案 0 :(得分:0)

你已经陷入了延迟扩张陷阱,就像Squashman所说的那样。

什么是延迟扩展?

在早期的批处理文件中,当每行都被表达时,变量会被扩展(更改为它的值)。

命令处理器将整个for循环视为一个命令,因此变量%tcs%被视为空。 (因为tcs之前已设置为空。

如何在运行时使批量变量扩展?

为了保持与旧批处理文件的兼容性,添加了延迟扩展功能。要允许处理器执行此操作,请将此行添加到批处理文件的开头:

setlocal enableDelayedExpansion

我们还需要告诉处理器在运行时要扩展哪些变量,为此,请更改以下内容:

From  -> To
%var% -> !var!

请注意,只有%n%个变量可以更改为!n!。无法更改%%G / %G%0等元变量。

这里是使用延迟扩展的固定代码。:

SETLOCAL EnableDelayedExpansion
SET "tcs="

FOR %%G IN (%*) DO (
      SET "tcs=!tcs! -t %%G"      
)
ECHO %tcs%

答案 1 :(得分:0)

DelayedExpansion-free Solution

使用call命令,我们可以模拟延迟扩展。看一下这个例子

call command %%foo%% = setlocal enableDelayedExpansion
                       command !foo!

根据您的情况,代码应更改为:

SET "tcs="

FOR %%G IN (%*) DO (
      CALL SET "tcs=%%tcs%% -t %%G"      
)
ECHO %tcs%

CALL

的一些越野车行为

Call无法正确处理重定向字符和一些特殊字符:

  • &安培;
  • |
  • <
  • >
  • “富^栏”

    前4个示例的重定向将无法正常工作,而在最后一个示例中,插入符号(^)将加倍。资料来源:SS64