这似乎是一个琐碎的问题,但是我无法为此提出一个优雅的解决方案。
我有一个分配给环境变量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
的新单词列表?
答案 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
。
另请参阅: