【发布时间】:2013-06-06 00:57:45
【问题描述】:
我正在使用 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 ... | Out-File ... 可以说是 my 意图的最清晰表达。我是否可以匹配一个简单的模式对我来说并不重要;有很多方法可以在 PowerShell 中选择文件。 Out-File 的默认编码对我来说比 Set-Content 的默认编码更正确; Out-File 默认为 Unicode,Set-Content 默认为 ASCII。
Get-Content .\*.txt | Out-File .\Combined.txt
?)只匹配一个字符。如果您需要匹配多个,请使用星号 (*)。
我会走这条路:
Get-Content file1.txt, file2.txt | Set-Content file3.txt
如果您需要除 Set-Content 的默认设置的 ASCII 以外的其他内容,请在 Set-Content 上使用 -Encoding 参数。
【讨论】:
*.txt作为输入时的递归问题(因为set-content会锁定文件)
如果你需要更多的灵活性,你可以使用类似的东西
Get-ChildItem -Recurse *.cs | ForEach-Object { Get-Content $_ } | Out-File -Path .\all.txt
【讨论】:
警告:使用简单的Get-Content 连接(无论是否使用-Raw 标志)适用于文本文件; Powershell 对此太有帮助了:
-Raw,它会“修复”(即中断,双关语)换行符,或者 Powershell 认为的换行符。-Raw,您会在
每个文件部分的末尾,添加到管道的末尾。在较新的 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
您不得覆盖任何部分,即使用任何部分作为目标。目标文件必须不同于任何部分。否则你会大吃一惊,必须找到文件部分的备份副本。
【讨论】:
基于@Keith 答案的概括:
gc <some regex expression> | sc output
【讨论】:
bash,但短名称的原因是 PowerShell 中的别名 - 其中gc 是 Get-Content,sc 是 Set-Content。
这是一个有趣的例子,说明如何基于 Powershell 7 制作 zip-in-image 文件
Get-Content -AsByteStream file1.png, file2.7z | Set-Content -AsByteStream file3.png
Get-Content -AsByteStream file1.png, file2.7z | Add-Content -AsByteStream file3.png
【讨论】:
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,直到您的磁盘已满。
请注意,您必须在-Path 参数的末尾附加*,因为您使用的是-Include,如Get-ChildItem 文档中所述。
【讨论】: