我创建了名为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的先前内容。
答案 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)
使用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