Windows XP中的批处理文件CONCAT(Windows XP batch file conc

2019-07-20 07:46发布

我试图完成以下任务可笑:

我有一个包含了一组完全合格的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材料一些东西,很多土生土长的网站,但没有特别完整。

Answer 1:

至于参考, 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% 


Answer 2:

什么你可以用做后FOR / F命令。

下面是我多次使用一个很好的资源:

http://www.robvanderwoude.com/batchfiles.php



Answer 3:

一本好书:Windows NT的Shell脚本由蒂姆·希尔。 该版本我已经出版于1998年,但它仍然是有效的在Windows 2008中的Windows命令程序。



Answer 4:

type *commonfilepart* >> concat_result_file

操作系统:Windows Server 2003



文章来源: Windows XP batch file concat