仅当目标中不存在文件时才复制文件

仅当目标中不存在文件时才复制文件

我想将多个文件夹中的多个文件从一个硬盘 A 复制到另一个硬盘 B。

我怎样才能仅将文件从 A 复制到 B,并且如果文件已存在于 B 中则跳过复制?

使用 xcopy 可以实现这个吗?

答案1

您可以通过管道传输源的递归 GCI 的结果,测试它是否是文件夹或文件,然后使用此对象来测试路径以检查是否存在于目标文件夹中。

就像是 ...

   # Initial setup defaults
    $Start = Date # Uses this start time at the end to calculate how long the process took!
    $src = 'C:\Original Folder'
    $dest = 'D:\New Folder'

Get-ChildItem -Path $src -Recurse | 

           % {
             If ($_.PSIsContainer)
              { If (Test-Path (Join-Path (Join-Path $dest $_.Parent.FullName.SubString($src.Length)) $_.BaseName)){
                    }Else{
                        $_ | Copy-Item  -Destination {Join-Path $dest $_.Parent.FullName.Substring($src.length)} -Force #-Whatif
                    }
                }Else{
                    If (Test-Path (Join-Path $dest $_.FullName.SubString($src.Length))){ 
                    }Else{
                    $_ | Copy-Item  -Destination {Join-Path $dest $_.FullName.Substring($src.length)} -Force #-Whatif
              }
             }
            }  -ErrorAction Continue


    $End = Date
    $TimeDiff = New-TimeSpan $Start $End
    $Difference = "{0:G}" -f $TimeDiff

Write-Host " Scan time " $Difference " [(Days) Hours Minutes Seconds]"

如果文件上的测试路径成功,但文件名称相同但时间戳不同,那么您将需要实现文件之间的某种比较或检查文件上次写入时间,如下所示

If ($_.LastWriteTime -gt ((Join-Path $dest $_.FullName.SubString($src.Length)).LastWriteTime)){ $_ | Copy-Item  -Destination {Join-Path $dest $_.FullName.Substring($src.length) }}

相关内容