如何将一个字符串附加到单词列表中的每个单词并将新单词列表分配给变量?

时间:2019-11-18 06:04:10

标签: windows batch-file

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

我有一个分配给环境变量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的新单词列表?

1 个答案:

答案 0 :(得分:1)

command prompt窗口set /?中运行时输出的命令 SET 的帮助在 IF FOR上进行了说明示例,类似于何时以及如何使用delayed environment variable expansion的代码。

@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

上面的代码将字符串中的所有!解释为延迟的扩展环境变量引用的开始/结束,导致错误的处理,这可以通过在第四行甚至更多中使用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"

在执行命令 SET 之前,命令 CALL 导致对set "C=%C% %Iing"的另一处理,在该命令上,%C%被环境的当前值所代替变量C

另请参阅: