递归 Get-ChildItem 并合并同一目录中的文件

Recursive Get-ChildItem and merging files within the same directory

我正在尝试执行递归搜索,将文件合并到文件所在目录中的单个文件中。查找名为 Dexis_Conflit_(*).dat 的文件并合并,或创建一个名为 dexis.dat 的文件。 .dat 文件是纯文本。我需要在数千个文件夹中查找和合并这些文件。我有一个基本的 PowerShell 代码可以找到所有文件及其相应的文件夹,但我不知道如何将它们全部合并到正确的文件中目录。

Get-ChildItem -File -Include "dexis_conflict_(*).dat" -Path D:\apps\dexis\data -Recurse -OutVariable DEXIS.dat

我尝试过使用 Out-File、Set-Content、Add-Content 和 foreach,但我无法弄明白。任何帮助将不胜感激。

编辑:大多数 95% 的文件夹中已经有一个 dexis.dat 文件。所有“冲突”文件都需要合并到主 dexis.dat 文件中。那些没有 dexis.dat 文件的文件夹,需要创建它并将冲突文件合并到其中。

一如既往,有很多方法可以使用 PowerShell 来解决这个问题,所以这是我的看法:

Get-ChildItem -Path "D:\apps\dexis\data" -Filter "dexis_conflict_(*).dat" -File -Recurse | 
    ForEach-Object -Begin {
        $saveTo = "DEXIS.dat"
    } -Process {
        $parentPath = Resolve-Path $_.PSParentPath -Relative 
        $jointPath  = Join-Path -Path $parentPath -ChildPath $saveTo
            if (-not (Test-Path -Path $jointPath)) {
                New-Item -Path $jointPath | Out-Null  
            }
        Get-Content -LiteralPath $_.FullName | Add-Content -LiteralPath $jointPath 
    }

鉴于您的文件只是纯文本文件,因此不需要使用特定的文件编码(例如字节),但如果需要,仍然可以使用该选项。除此之外,剩下的就很简单了。使用 Resolve-Path 我们可以摆脱 PowerShell 添加到父路径的不需要的前置文本。然后,使用 Join-Path 我们可以创建 .\.\DEXIS.dat 的文件路径,我们可以对其进行测试。这是可行的,因为 PowerShell 在移动到下一个 sub-folder.

之前一次处理每个目录中的文件

所以...

  • 测试 dexis.dat 是否存在,如果不存在,则创建文件。
  • 如果文件确实存在,只需使用 Add-Content.
  • 将每个 dexis_conflict_(*).dat 文件的内容附加到它

现在,每个目录都应该有一个 DEXIS.dat 文件,其中包含 dexis_conflict_(*).dat.

文件名的合并内容