Windows XP中的批处理文件CONCAT
-
19-09-2019 - |
题
我试图完成以下任务可笑:
我有一个包含一组完全合格filesnames的文本文件。我想通过文件迭代和每行追加到一个共同的变量,可以传递一个命令行工具。例如,该文件可能是:
C:\ DIR \ 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 是不坏。 罗布范德瓦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%是 扩大只是一次当FOR 声明被读取,而当时 List变量是空的。所以 实际FOR我们正在执行循环是:
这只是不断设定LIST到for %i in (*) do set LIST= %i
最后文件中找到。
延迟的环境变量扩展 允许您使用不同的 字符(感叹号)至 扩大环境变量在 执行时间处理时间。如果延迟变量 扩充被启用,上述 例子可以写成如下 按预期方式工作:
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%
其他提示
一本好书:Windows NT的Shell脚本由蒂姆·希尔。该版本我已经出版于1998年,但它仍然是有效的Windows命令程序在Windows 2008。
type *commonfilepart* >> concat_result_file
OS:WINDOWS SERVER 2003