如何串联Windows批处理文件中的字符串?


74

我有一个目录,我想用列出所有.doc文件;

我知道以下批处理命令会回显所有文件:

for /r %%i In (*.doc) DO echo %%i

但是现在我想将它们全部放入一个变量中,;在两者之间添加一个,并立即将它们全部回显。
我怎样才能做到这一点?

set myvar="the list: "
for /r %%i In (*.doc) DO <what?>
echo %myvar%

Answers:


63

关于什么:

@echo off
set myvar="the list: "
for /r %%i in (*.doc) DO call :concat %%i
echo %myvar%
goto :eof

:concat
set myvar=%myvar% %1;
goto :eof

2
非常感谢您的回答!它只是解决了我一个在批处理文件中动态创建类路径的问题:)添加了必要的修改,但是我的问题是在做concat时,它已经解决了!
Charliemops

45

基于鲁本斯的解决方案,您需要启用env变量的延迟扩展(类型为“ help setlocal”或“ help cmd”),以便在循环中正确评估var:

@echo off
setlocal enabledelayedexpansion
set myvar=the list: 
for /r %%i In (*.sql) DO set myvar=!myvar! %%i,
echo %myvar%

还请考虑以下限制(MSDN):

单个环境变量的最大大小为8192字节。


1
限制是错误的。Windows中最大环境变量的大小约为64 KiB,因此约为32k个字符。但是,在批处理文件中,您会遇到最大命令行长度为8190个字符的问题,因此在其中设置的每个环境变量都必须较短。同样,65 KiB的总环境限制是虚假的。我刚刚创建的环境变量总计为MiB,没有问题。
乔伊(Joey)2010年

2
链接显示65,000 KB,相当于64MB。我不会争论,因为我从未处理过。
devio 2010年

1
因此,人们不会犯与我相同的新手错误,如果不想在自己的中删除“列表:” myvar

0

请注意,变量@fname@ext可以简单地连接起来。这个:

forfiles /S /M *.pdf /C "CMD /C REN @path @fname_old.@ext"

将所有PDF文件重命名为“ filename_old.pdf”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.