使用 Robocopy 更新功能将子目录中的所有文件复制到单个文件夹

Copying all Files in Subdirectories to a Single Folder with Robocopy Updating Capabilities

我正在尝试将包含许多子文件夹的目录中的所有文件复制到一个单独的文件夹中。当代码再次为 运行 时,与其替换目标文件夹中的每个文件,不如跳过具有相同时间戳的文件,只替换较旧的文件。

我已使用 robocopy 跳过复制目标文件夹中当前 version/older 的文件。但是,robocopy 仅复制整个目录及其文件夹结构,因此我无法从源中获取包含所有文件列表的所需文件夹。

我也用过get child-item然后copy-item。然而,虽然这能够摆脱文件夹结构,但它会为每次迭代覆盖每个文件,因此非常耗时。

所以我想要的是结合robocopycopy-item的能力。请注意,我要复制的文件没有特定的模式。只需将子目录中的每个文件(新版本或不存在的文件)复制到一个文件夹中即可。

#For copying and ease of updating destination folder
robocopy /purge /np /S /xo 'source' 'destination'
#To copy items into the destination folder without keeping folder structure
Get-ChildItem -Path 'source' -Recurse -File | Copy-Item -Destination 'destination'

无法将两者结合起来,所以我坚持使用 'copy-item' 代码,当 copying/updating 大量文件时,这非常耗时。

robocopy 的目的是保留文件夹结构。如果你想破坏子文件夹,robocopy 不是正确的工具。使用 Get-ChildItem 方法,按文件名对结果进行分组,按日期对每个组进行排序,从每个组中选择最新的文件,如果相应的目标文件不存在或较旧,则复制它。

像这样应该可以满足您的要求:

Get-ChildItem -Path 'C:\source' -Recurse -File |
    Group-Object Name |
    ForEach-Object {
        $src = $_.Group | Sort-Object | Select-Object -Last 1
        $dst = Join-Path 'C:\destination' $src.Name
        if (-not (Test-Path $dst) -or ($src.LastWriteTime -gt (Get-Item $dst).LastWriteTime)) {
            $src | Copy-Item -Destination $dst
        }
    }