首页 > 解决方案 > 如何将字符串附加到单词列表中的每个单词并将新单词列表分配给变量?

问题描述

这似乎是一个微不足道的问题,但我无法为此提出一个优雅的解决方案。

我有一个分配给环境变量的单词列表A。我有另一个变量b,它的字符串值应该与单词列表中的每个单词连接,A以获得分配给环境变量的新单词列表C

这是我到目前为止的代码:

@echo off
set A=test batch
set b=ing

for %%a in (%A%) do (
    set C=%%a%b%
)

echo %C%
Pause

命令行echo %C%应该输出testing batching,但用这段代码输出只是batching

如何将变量的字符串值附加到变量b单词列表中的每个单词A以获得分配给变量的新单词列表C

标签: windowsbatch-file

解决方案


在命令提示符窗口中运行的命令SET输出的帮助解释了IFFOR示例,类似于有问题的代码何时以及如何使用延迟的环境变量扩展set /?

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "A=test batch"
set "b=ing"
set "C="

for %%I in (%A%) do set "C=!C! %%I%b%"

rem Remove the space character at beginning.
set "C=%C:~1%"
echo %C%

endlocal
pause

上面的代码将所有!in 字符串解释为延迟扩展环境变量引用的开始/结束,从而导致错误处理,这可以通过set "b=ing!"在第四行中使用或更糟set "A=!test! batch"地在第三行中使用来看到。

还有另一种解决方案可以避免使用延迟的环境变量扩展,因此也适用于包含一个或多个感叹号的字符串。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "A=test batch"
set "b=ing"
set "C="

for %%I in (%A%) do call set "C=%%C%% %%I%b%"

rem Remove the space character at beginning.
set "C=%C:~1%"
echo %C%

endlocal
pause

两边C都引用了环境变量,导致在执行命令FOR之前,Windows 命令处理器将FOR命令行处理为以下内容:%%

  for %I in (test batch) do call set "C=%C% %Iing"

命令CALLset "C=%C% %Iing"导致在执行命令SET之前再进行一次处理,将其%C%替换为环境变量的当前值C

也可以看看:


推荐阅读