如何在PowerShell中连接两个文本文件?

mer*_*011 98 powershell powershell-2.0

我试图在Unix中复制"cat"命令的功能.

我想避免解决方案,我明确地将两个文件读入变量,将变量连接在一起,然后写出连接变量.

Smi*_*Smi 142

你可以简单地使用cat example1.txt, example2.txt | sc examples.txt.您也可以使用此样式连接两个以上的文件.另外,如果文件名称相似,您可以使用:

cat example*.txt | sc allexamples.txt
Run Code Online (Sandbox Code Playgroud)

cat是别名Get-Content,sc是别名Set-Content.

注意1:小心后一种方法 - 如果你尝试输出examples.txt(或类似的模式匹配),PowerShell将进入无限循环!(我刚试过这个).

注意2:输出到文件时>不保留字符编码!这就是建议使用using Set-Content(sc)的原因.

  • 请注意,默认情况下“Set-Content”使用国家代码页(例如英语的 Windows-1252)。如果源文件包含其他编码(例如 Windows-1251 或 UTF8),则必须设置正确的编码`sc file.txt -Encoding UTF8`(自 v6.2 起支持俄语的 1251 等数字) (4认同)
  • 以防万一有人想用_Get-ChildItems迭代文件 Foreach-Object_构造您可能希望使用Add-Content而不是Set-Content.否则,在每次迭代中都会覆盖目标文件. (3认同)
  • @DanielLidström 它也适用于具有正确参数的二进制文件:`Get-Content my.bin -Raw | Set-Content my.bin -NoNewline` 不会更改除时间戳之外的 `my.bin`。`-Raw` 保留任何 CR/LF 字节,而 `-NoNewline` 则阻止 PowerShell 添加自己的 CR/LF 字节。 (3认同)
  • 如果文件是二进制文件(例如,在我的例子中是 zip 文件的一部分),则似乎不起作用。 (2认同)

小智 56

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

Get-Content files.* | Set-Content newfile.file
Run Code Online (Sandbox Code Playgroud)

我花了好几个小时才找到它.

  • @ n0rd我认为这更像是"使用管道而不是"的东西. (5认同)

man*_*lds 13

cmd,您可以这样做:

copy one.txt+two.txt+three.txt four.txt
Run Code Online (Sandbox Code Playgroud)

在PowerShell中,这将是:

cmd /c copy one.txt+two.txt+three.txt four.txt
Run Code Online (Sandbox Code Playgroud)

虽然PowerShell的方式是使用gc,但上面的速度非常快,特别是对于大文件.并且它也可以使用交换机在非ASCII文件上使用/B.

  • 对我来说,cat命令比cmd/c命令运行的时间长了几个数量级(运行速度非常快); 谢谢你指出了这个选项! (3认同)

mjs*_*jsr 12

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

gc .\file2.txt| Add-Content -Path .\file1.txt
Run Code Online (Sandbox Code Playgroud)


Pho*_*830 5

我用了:

Get-Content c:\FileToAppend_*.log | Out-File -FilePath C:\DestinationFile.log 
-Encoding ASCII -Append
Run Code Online (Sandbox Code Playgroud)

这附加了罚款。我添加了 ASCII 编码来删除 Notepad++ 在没有显式编码的情况下显示的空字符。


Bri*_*all 5

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

type file1.txt file2.txt file3.txt > files.txt
Run Code Online (Sandbox Code Playgroud)

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

Get-Content file1.txt,file2.txt,file3.txt | Set-Content files.txt
Run Code Online (Sandbox Code Playgroud)


Rom*_*n O 5

如果您需要按特定参数(例如日期时间)对文件进行排序:

gci *.log | sort LastWriteTime | % {$(Get-Content $_)} | Set-Content result.log
Run Code Online (Sandbox Code Playgroud)