Windows批处理-连接多个文本文件为一个

86

我需要创建一个脚本,将多个文本文件合并为一个。 我知道这很简单使用

type *.txt > merged.txt

但要求是将同一天的文件合并成day_YYYY-DD-MM.txt文件。我是Linux用户,Windows批处理对我来说很麻烦。这是Windows XP。


你应该告诉我们是否需要在“真正的”批处理文件中完成,或者powershell / Windows脚本宿主是否可用。首先,你应该提到需要支持哪个Windows版本(最小/最大)。 - Marged
1
您可以在Windows XP上安装Powershell 2.0。请参阅https://support.microsoft.com/en-us/kb/968929。 - Tony Hinkle
这是你的家庭作业吗? - Endoro
@Endoro 不,这不是作业。 - SpeedEX505
1
我没有建议使用cygwin,因为我认为您想要一个最小化的解决方案。您问题的标题表明您希望基于Windows机制的解决方案。 - Marged
显示剩余7条评论
10个回答

137

Windows type 命令与 UNIX 的 cat 命令类似。

示例 1:合并文件名(将 file1.csv 和 file2.csv 合并成 concat.csv)。

type file1.csv file2.csv > concat.csv

例子2:使用模式合并文件(将合并所有扩展名为csv的文件,并创建concat.csv)

当使用星号(*)连接所有文件时,请不要在目标文件中使用相同的扩展名(例如.csv)。 模式应该有一些差异,否则目标文件也会被视为合并的一部分。

type  *.csv > concat_csv.txt

9
这是Unix命令最直接的等效版本,应该被接受为答案。 - Asped
2
这也是最低效的方法,因为“type”将以约4 KiB块的方式执行其任务,使操作极其缓慢。 - Ivan Voras
15
不要使用相同的文件扩展名作为目标文件。当我运行这个命令后等待了几分钟,直到我注意到它陷入了无限循环将目标文件添加到自身并创建一个不断增长的文件中(当我注意到它在尝试合并2MB的文件时就已经卡住了,而文件大小已经达到了15GB)。 - Adam Tal
工作得相当不错,谢谢。注意:比在 LINUX 中慢得多... - Kerim Yagmurcu

49

最基本的批处理文件中,将文件连接起来是用 'copy' 命令实现的。

copy file1.txt + file2.txt + file3.txt concattedfile.txt

1
我尝试使用命令“copy *.xyz all.bin”将所有的.xyz文件复制到all.bin中,但最终生成的all.bin文件只包含该目录下的某些xyz文件。 我不知道为什么没有包含所有的文件。 加号语法必须吗? 如果是这样,对于大量的文件来说这很不方便。 - StayOnTarget
1
我刚按照你的规格创建了一个示例,并符合预期地运行。我创建了“1.xyz”、“2.xyz”和“3.xyz”。然后运行了“copy *.xyz all.bin”,结果生成的“all.bin”包含了所有3个文件的内容。所以我不知道为什么它对你不起作用。 - Lance
谢谢你测试了一下。我需要进一步实验来找出原因! - StayOnTarget
13
您还应该提到"/b"(二进制)运算符。在文本文件中使用它也会复制每个文件的BOM标头(例如UTF8+BOM,UCS2+BOM),并在以后产生巨大的复杂性... - Bernhard
1
这对于大文件来说速度要比被接受的答案快得多。 - ashleedawg
我在DOS cmd shell中使用了几十年。但它在Power Shell中不起作用。请使用Windows 10的cmd。 - Doug Null

15

在Windows 7中,导航到存放文本文件的目录。在命令提示符中使用:

copy *.txt combined.txt

其中combined.txt是新创建的文本文件的名称。


Win 11:对我来说,这相当于“复制 file1.txt combined.txt”,然后“复制 file2.txt combined.txt”等。也就是说,combined.txt 是列表中最后一个文件的副本,而不是它们所有文件的连接。键入...已经生效。 - Convexity

13

将所有需要复制的文件放置在单独的文件夹中,为了方便,可以将它们放在 C 盘。

打开命令提示符 - 在 Windows 中键入 cmd ,选择命令提示符。

您可以看到默认目录指向 - 例如:C:[Folder_Name]>。 使用 'cd [Folder_Name]' 命令更改目录以指向您放置要复制的文件的文件夹。

指向目录后 - 输入 'dir',它将显示文件夹中存在的所有文件,以确保一切就绪。

现在输入:'copy *.txt [newfile_name].txt' 然后按回车键。

完成!

所有单独文件中的文本都将被复制到 [newfile_name].txt 中。


5
看起来会在生成的文件末尾添加一个额外的0x1A字符,如果我回想起来的话,这个字符在以前是表示文件结束的“控制Z”标志。 - ALEXintlsos
不要忘记删除文件末尾的额外字符0x1A。 - Mimouni

8
我将重申其他已经提到的一些要点,并包括第三个例子,帮助你在想要连接文件夹中的文件时更加方便。
例子1(文件在同一个文件夹中):
copy file1.txt+file2.txt+file3.txt file123.txt

示例2(文件在同一文件夹中):

type *.txt > combined.txt

示例3(文件存在于多个文件夹中,假设newfileoutput.txt不存在):
for /D %f in (folderName) DO type %f/filename.txt >> .\newfileoutput.txt

5
我们可以使用普通的 CAT 命令来合并文件。
D:> cat *.csv > outputs.csv

8
Windows 操作系统中没有 CAT。 - Yarik
3
有些软件包(如Git)附带cat命令,也许他误以为这是一个DOS命令。 - StayOnTarget
1
肯定微软发布了cat.exe -> 它包含在nt4资源工具包中 - 请参见https://news.microsoft.com/1996/10/29/microsoft-announces-resource-kits-for-microsoft-windows-nt-4-0/。 - Bernhard

3

使用命令 "cat "input files" > "output files"" 可以在PowerShell中运行。PowerShell是当前Windows版本中首选的shell,因此它可以正常工作。此外,在处理大文件时,此方法也是以上答案中唯一能够正常工作的方法,而"type"或"copy"则会失败。


OP编辑了他们的帖子:“它是Windows XP”。是否也有Windows XP的解决方案? - CodeF0x
使用资源工具包NT 4.0 - 还有一个cat.exe(仍可在Win10上运行)。 - Bernhard

1

试试这个:

@echo off
set yyyy=%date:~6,4%
set mm=%date:~3,2%
set dd=%date:~0,2%

set /p temp= "Enter the name of text file: "
FOR /F "tokens=* delims=" %%x in (texto1.txt, texto2.txt, texto3.txt) DO echo %%x >> day_%temp%.txt

这段代码要求您在“day_”后设置文件名,您可以输入日期。 如果您想将文件命名为实际日期,可以这样做:

FOR /F "tokens=* delims=" %%x in (texto1.txt, texto2.txt, texto3.txt) DO echo %%x >> day_%yyyy%-%mm%-%dd%.txt

1
你的答案结果取决于系统的本地设置。 - Endoro

0

你可以使用类型来完成它:

type"C:\<Directory containing files>\*.txt"> merged.txt

目录中的所有文件都将被追加到文件merged.txt中。


-1

copytype快得多,但有时(对于大文件?)会在文件末尾添加一个SUB字符。因此,严格来说,它不像Unix中的cat那样简单地连接文件。

因此,正确的答案是使用cat - 要么在类似Git Bash的东西中(其中它具有与Unix相同的语法),要么在PowerShell中(其中它没有)。


1
SUB是CP/M的产物,它被用作EOF标记(CP/M“长度”是块,而不是字节)。MSDOS被设计成能够读取CP/M文件,并且由于当时很可能会使用CP/M来读取MSDOS的结果,因此在copy中包括了控制文件结尾标记的能力,使用/A/B开关。默认情况下,它将/A^Z=EOF)应用于输入文件,但如果在输入文件名之前出现/B标志,则^Z将被保留。每个单独的文件都可以通过其自己的开关进行控制。如果目标文件名有/A,则会附加SUB。 - Magoo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接