如何在PowerShell中串联两个文本文件?


108

我正在尝试cat在Unix中复制命令的功能。

我想避免这样的解决方案:将两个文件显式地读入变量,将变量串联在一起,然后写出串联变量。

Answers:


170

您可以简单地使用cat example1.txt, example2.txt | sc examples.txt。您当然也可以使用这种样式连接两个以上的文件。另外,如果文件的命名类似,则可以使用:

cat example*.txt | sc allexamples.txt

cat是一个别名Get-Content,并且sc是一个别名Set-Content

注意1:请注意后一种方法-如果尝试输出到examples.txt(或与模式匹配的类似内容),PowerShell将陷入无限循环!(我刚刚测试过)。

注意2:输出到的文件>不会保留字符编码!这就是为什么建议使用Set-Contentsc)的原因。


5
以防万一有人想使用Get-ChildItems | 您可能想要使用Add-Content而不是Set-Content的Foreach-Object构造。否则,目标文件在每次迭代中都会被覆盖。
乔纳斯(Jonas)

1
请注意,默认情况下Set-Content使用国家代码页(例如Windows-1252为英文)。如果源文件包含其他编码(例如Windows-1251或UTF8),则必须设置正确的编码sc file.txt -Encoding UTF8(自v6.2开始支持俄语的数字,例如1251)
Radek Pech

@Jonas的问题Add-Content是,如果您两次运行命令,则聚合文件的长度是原来的两倍。一个好的替代品是Out-File这里的
Dan Friedman

1
如果文件是二进制文件(例如,在我的情况下为zipfile的一部分),则似乎不起作用。
DanielLidström

1
@DanielLidström它也适用于具有正确参数的二进制文件:除时间戳记外Get-Content my.bin -Raw | Set-Content my.bin -NoNewline不会更改my.bin-Raw保留任何CR / LF字节,同时-NoNewline阻止PowerShell添加自己的CR / LF字节。
托马斯·

62

不要使用>; 它弄乱了字符编码。用:

Get-Content files.* | Set-Content newfile.file

cat是的别名Get-Content
2015年

5
@ n0rd我认为这更像是“使用管道代替”。
ksoo 2013年

可以确认。使用时,ÿþ它正在FF FE连接文件的开头>
gpresland

16

在中cmd,您可以执行以下操作:

copy one.txt+two.txt+three.txt four.txt

在PowerShell中,这将是:

cmd /c copy one.txt+two.txt+three.txt four.txt

虽然PowerShell的方式是使用gc,但是上述操作相当快,特别是对于大型文件。而且也可以使用开关在非ASCII文件上使用/B


3
对我来说,cat命令的运行时间比cmd / c命令的运行时间长多个数量级(运行速度非常快);感谢您指出该选项!
罗布

这是最好的答案。
Nicholas DiPiazza

12

您可以使用Add-Content cmdlet。也许它比其他解决方案要快一点,因为我没有检索第一个文件的内容。

gc .\file2.txt| Add-Content -Path .\file1.txt

要什么gc参考?
octopusgrabbus

gc是Get-Content
MM

8

要在命令提示符下连接文件,它将是

type file1.txt file2.txt file3.txt > files.txt

PowerShell将type命令转换为Get-Content,这意味着type在PowerShell中使用该命令时会出现错误,因为该Get-Content命令需要用逗号分隔文件。在PowerShell中,相同的命令是

Get-Content file1.txt,file2.txt,file3.txt | Set-Content files.txt

5

如果需要按特定参数(例如日期时间)订购文件:

gci *.log | sort LastWriteTime | % {$(Get-Content $_)} | Set-Content result.log

3

我用了:

Get-Content c:\FileToAppend_*.log | Out-File -FilePath C:\DestinationFile.log 
-Encoding ASCII -Append

这追加罚款。我添加了ASCII编码,以删除Notepad ++在没有显式编码的情况下显示的nul字符。


2

您可以执行以下操作:

get-content input_file1 > output_file
get-content input_file2 >> output_file

其中>,“ out-file”的别名是哪里,而>>是“ out-file -append”的别名。


2

由于大多数其他回复通常会由于格式错误而导致格式错误(由于管道问题),因此最安全的做法如下:

add-content $YourMasterFile -value (get-content $SomeAdditionalFile)

我知道您想避免将$ SomeAdditionalFile的内容读入一个变量,但是为了保存例如换行符格式,我认为没有这种方法是没有适当的方法的。

一种解决方法是逐行循环$ SomeAdditionalFile并将其管道传输到$ YourMasterFile中。但是,这过于耗费资源。


1

要保持编码和行尾:

Get-Content files.* -Raw | Set-Content newfile.file -NoNewline

注意:AFAIR,旧的Powershell(<3?<4?)不支持其参数


0

我认为“ powershell方式”可能是:

set-content destination.log -value (get-content c:\FileToAppend_*.log )
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.