Я хочу скопировать множество файлов во многие папки с одного жесткого диска A на другой жесткий диск B.

Как я могу скопировать только файлы из A в B и пропустить копию, если файлы уже существуют в B?

Это возможно с xcopy?

1 ответ1

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) }}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .