这似乎是一个微不足道的问题,但我无法为此提出一个优雅的解决方案。
我有一个分配给环境变量的单词列表
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
的新单词列表?
在命令提示符窗口中运行时的命令SET输出帮助解释了
IF和FOR示例,类似于相关代码何时以及如何使用延迟环境变量扩展。
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
都被上面的代码解释为延迟扩展环境变量引用的开始/结束,导致错误的处理,可以通过在第四行中使用
!
看到,或者使用 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 命令行处理为以下内容:
%%
命令CALL
会导致在执行命令 SET 之前再处理一次
for %I in (test batch) do call set "C=%C% %Iing"
,其中 set "C=%C% %Iing"
会被环境变量 %C%
的当前值替换。另请参阅: