我正在使用PowerShell 3。
如何最佳地将文件连接在一起?
file1.txt + file2.txt = file3.txt
PowerShell提供直接执行此操作的功能吗?还是需要将每个文件的内容加载到本地变量中?
我正在使用PowerShell 3。
如何最佳地将文件连接在一起?
file1.txt + file2.txt = file3.txt
PowerShell提供直接执行此操作的功能吗?还是需要将每个文件的内容加载到本地变量中?
Get-Content .\File?.txt | Out-File .\Combined.txt
Get-Content .\*.txt | Out-File .\Combined.txt
。 - omni?
)只匹配一个字符。如果您需要匹配多个字符,请使用星号(*
)。 - Jason我会选择这条路线:
Get-Content file1.txt, file2.txt | Set-Content file3.txt
如果您需要使用Set-Content输出非ASCII文本,则需要在Set-Content命令中使用-Encoding参数,因为ASCII是Set-Content的默认编码。
*.txt
作为输入时出现递归问题(因为set-content锁定了文件)。 - Peter WishartGet-ChildItem -Recurse *.cs | ForEach-Object { Get-Content $_ } | Out-File -Path .\all.txt
警告: 使用简单的 Get-Content
进行串联(无论是否使用 -Raw
标志)仅适用于文本文件;Powershell 对此太过“热心”了:
-Raw
,它会“修复”(也就是打破,断开)换行符,或者Powershell认为是换行符的地方。-Raw
,你会在每个文件部分的结尾处得到一个终止行结束符(通常是CR+LF),它会添加到管道的末尾。新版 Powershell 的 Set-Content 中有一个选项可用于此。要串联二进制文件(即任意被拆分并需要重新组合的文件),请使用以下方法之一:
Get-Content -Raw file1, file2 | Set-Content -NoNewline destination
或者像这样:
Get-Content file1 -Encoding Byte -Raw | Set-Content destination -Encoding Byte
Get-Content file2 -Encoding Byte -Raw | Add-Content destination -Encoding Byte
另一种选择是使用CMD shell并使用
copy file1 /b + file2 /b + file3 /b + ... destinationfile
您不得覆盖任何部分,也就是说,不能使用其中任何一个部分作为目标。目标文件必须与任何部分都不相同。否则,您将会遭遇意外情况,并且必须找到文件部分的备份。
gc file1.txt, file2.txt > output.txt
我认为这已经是最短的了。
如果您想确保连接按特定顺序完成,请使用Sort-Object -Property <Some Name>
参数。例如,根据名称升序排序进行连接:
Get-ChildItem -Path ./* -Include *.txt -Exclude output.txt | Sort-Object -Property Name | ForEach-Object { Get-Content $_ } | Out-File output.txt
重要提示:-Exclude
和Out-File
必须包含相同的值,否则它将递归地继续添加到output.txt
,直到您的磁盘已满。
请注意,因为您正在使用-Include
,所以-Path
参数末尾必须附加*
,如Get-ChildItem文档中所述。
gc <some regex expression> | sc output
bash
的,但短名称的原因是PowerShell中的别名 - 其中gc
是Get-Content,而sc
是Set-Content。 - c69这是一个有趣的示例,展示如何基于 Powershell 7 创建一个包含压缩文件的图像文件。
Get-Content -AsByteStream file1.png, file2.7z | Set-Content -AsByteStream file3.png
Get-Content -AsByteStream file1.png, file2.7z | Add-Content -AsByteStream file3.png
以上的例子对我来说都不太好用,因为我处理的是大文件(5GB+)。Set-Content 首先会将所有内容加载到内存中(导致内存爆炸),然后再写入。相反,使用文本流写入更好。在查看了这个其他���题的答案后,我采用了下面的方法来合并一个头文件和一个数据文件!
$file = [system.io.file]::OpenWrite("$($pwd.Path)\out.txt")
$writer = New-Object System.IO.StreamWriter($file)
cat headers.txt,data.txt | ForEach-Object { $writer.WriteLine($_) }
$writer.Close()
$file.Close()