我试图完成以下任务可笑:
我有一个包含了一组完全合格的filesnames的文本文件。 我想通过文件迭代和每行追加到一个共同的变量,可以传递一个命令行工具。 例如,该文件可能是:
C:\目录\ test.txt的
C:\ WINDOWS \的test2.txt
C:\ text3.txt
我想将它们分配给一些变量“a”,使得:
a = "C:\dir\test.txt C:\WINDOWS\test2.txt C:\text2.txt"
次要问题是 - 什么是好的批处理文件的参考? 我发现在Windows材料一些东西,很多土生土长的网站,但没有特别完整。
至于参考, SS64.com也不错。 罗布的van der Woude得到相当频繁联系,太。
至于你的问题,那很简单:
@echo off
setlocal enableextensions enabledelayedexpansion
set LIST=
for /f %%x in (yourfile.txt) do (
set LIST=!LIST! "%%x"
)
echo %LIST%
endlocal
更深入的解释:
setlocal enableextensions enabledelayedexpansion
我们在这里启用延迟扩展 。 这是关键,因为否则我们不会将能够操纵中的文件列表for
后面循环。
for /f %%x in (yourfile.txt) do (
set LIST=!LIST! "%%x"
)
for /f
在文件中的行迭代,所以正是我们需要在这里。 在每次循环迭代,我们追加下一行的LIST
变量。 使用注意事项!LIST!
而不是通常的%LIST%
这个信号延迟扩展,并确保变量被重新评估每运行此命令的时间。
通常cmd
尽快扩大变量它们的值作为行被读取和解析。 对于cmd
单行或者是计数为一条线,这恰好持有由像我们这里使用的一个括号分隔块真线或一切。 所以对于cmd
完整的块是被读取和解析一次一个说法,不管多久循环运行的内部。
如果我们会用%LIST%
在这里,而不是!LIST!
那么变量会被立刻被它的值替换(在这一点上是空的)和环看起来会是这样的:
for /f %%x in (yourfile.txt) do (
set LIST= "%%x"
)
显然,这不是我们想要的。 延迟扩展可以确保真正需要它的值时,变量不仅扩大。 在这种情况下,当环路的内部运行和构建文件名的列表。
此后变量%LIST%
或!LIST!
(现在它并没有真正的事情了其使用)包含了文件中的行列表。
有趣的是,对于帮助set
命令包括正是这种例子为延迟扩展:
最后,对于延迟的环境变量扩展支持已被添加。 该支持总是默认被禁用,但是可以被使能/经由/ V命令行开关CMD.EXE禁用。 请参阅CMD /?
延迟环境变量扩充是围绕当前扩张时,文本行被读取,而不是执行的时候恰好的局限性越来越有用。 下面的例子演示立即变量扩展问题:
set VAR=before if "%VAR%" == "before" ( set VAR=after if "%VAR%" == "after" @echo If you see this, it worked )
绝不会显示该消息,因为在这两种IF语句的%VAR%IF语句被读取时,第一被取代,因为它在逻辑上包括IF,这是一个复合语句的主体。 所以,复合语句中的IF“之前”与真的比较“之后”,这将永远是平等的。 同样,预计下面的例子将不能工作:
set LIST= for %i in (*) do set LIST=%LIST% %i echo %LIST%
因为它不会建起来的文件列表在当前目录中,而是将只是LIST变量设置为找到的最后一个文件。 再次,这是因为%LIST%的在读FOR语句只是一次扩大,当时的LIST变量是空的。 所以,我们真正执行的循环是:
for %i in (*) do set LIST= %i
这个循环继续将LIST到找到的最后一个文件。
延迟环境变量扩充允许您使用一个不同的字符(惊叹号)在执行时间扩充环境变量。 如果延迟变量扩充被启用,上述实例可以写成如下按预期方式工作:
set VAR=before if "%VAR%" == "before" ( set VAR=after if "!VAR!" == "after" @echo If you see this, it worked ) set LIST= for %i in (*) do set LIST=!LIST! %i echo %LIST%
什么你可以用做后FOR / F命令。
下面是我多次使用一个很好的资源:
http://www.robvanderwoude.com/batchfiles.php
一本好书:Windows NT的Shell脚本由蒂姆·希尔。 该版本我已经出版于1998年,但它仍然是有效的在Windows 2008中的Windows命令程序。
type *commonfilepart* >> concat_result_file
操作系统:Windows Server 2003