【问题标题】:Concatenate files using PowerShell使用 PowerShell 连接文件
【发布时间】:2013-06-06 00:57:45
【问题描述】:

我正在使用 PowerShell 3。

连接文件的最佳做法是什么?

file1.txt + file2.txt = file3.txt

PowerShell 是否提供了直接执行此操作的工具?还是我需要将每个文件的内容加载到局部变量中?

【问题讨论】:

标签: powershell powershell-3.0


【解决方案1】:

如果所有文件都在同一个目录下,并且可以通过简单的模式匹配,下面的代码会将所有文件合并为一个。

Get-Content .\File?.txt | Out-File .\Combined.txt

【讨论】:

  • 当我做这样的事情时,Get-Content ... | Out-File ... 可以说是 my 意图的最清晰表达。我是否可以匹配一个简单的模式对我来说并不重要;有很多方法可以在 PowerShell 中选择文件。 Out-File 的默认编码对我来说比 Set-Content 的默认编码更正确; Out-File 默认为 Unicode,Set-Content 默认为 ASCII。
  • 对于所有想知道为什么在 Windows 8+ 上失败的人,请改用这个:Get-Content .\*.txt | Out-File .\Combined.txt
  • 就像@masi 所说,我对模式表达式感到困惑。对于像我这样密集的每个人,问号(?)只匹配一个字符。如果您需要匹配多个,请使用星号 (*)。
  • 这对我产生了递归文件炸弹,不要将输出文件与输入文件放在同一目录中。
  • 不是很有用,因为它没有显示输入文件必须用逗号分隔。
【解决方案2】:

我会走这条路:

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

如果您需要除 Set-Content 的默认设置的 ASCII 以外的其他内容,请在 Set-Content 上使用 -Encoding 参数。

【讨论】:

  • +1,我总是喜欢这些简单的 :) 当然,Out-File 也一样好。
  • @AthomSfere 是的,如果你想要 Unicode 编码 Out-File 默认为那个。
  • 这个答案避免了*.txt作为输入时的递归问题(因为set-content会锁定文件)
【解决方案3】:

如果你需要更多的灵活性,你可以使用类似的东西

Get-ChildItem -Recurse *.cs | ForEach-Object { Get-Content $_ } | Out-File -Path .\all.txt

【讨论】:

    【解决方案4】:

    警告:使用简单的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
    

    您不得覆盖任何部分,即使用任何部分作为目标。目标文件必须不同于任何部分。否则你会大吃一惊,必须找到文件部分的备份副本。

    【讨论】:

    • 在 PowerShell 5 上,尝试将几个 2GB 文件连接在一起失败。但是 CMD 副本效果很好!
    【解决方案5】:

    基于@Keith 答案的概括:

    gc <some regex expression> | sc output

    【讨论】:

    • 虽然这个答案看起来像是 bash,但短名称的原因是 PowerShell 中的别名 - 其中gc 是 Get-Content,sc 是 Set-Content。
    【解决方案6】:

    这是一个有趣的例子,说明如何基于 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
    

    【讨论】:

      【解决方案7】:
      gc file1.txt, file2.txt > output.txt
      

      我认为这是尽可能短的。

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      【解决方案8】:

      如果您想确保以特定顺序完成连接,请使用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

      重要提示: -ExcludeOut-File 必须包含相同的值,否则,它将递归地继续添加到 output.txt,直到您的磁盘已满。

      请注意,您必须-Path 参数的末尾附加*,因为您使用的是-Include,如Get-ChildItem 文档中所述。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-24
        • 2014-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多