chỉ sao chép tệp khi chúng không tồn tại


0

Tôi muốn sao chép nhiều tệp trong nhiều thư mục từ một đĩa cứng A sang đĩa cứng B.

Làm cách nào tôi chỉ có thể sao chép các tệp từ A sang B và bỏ qua bản sao nếu các tệp đã tồn tại ở B?

Điều này có thể với xcopy?


XCOPY không có tùy chọn như vậy ... sử dụng EXPLORER, nó có thể bỏ qua ghi đè cho tất cả các bản sao.
Akina

Trên cơ sở mỗi thư mục, bạn có thể sử dụngReplace /A
LotPings

@Akina: Tôi muốn biết lệnh Shell là như thế nào.
mrz

1
sử dụng robocopy nó có các tùy chọn như vậy
Drako

1
Đáng làm rõ những gì "đã tồn tại ở B". Khi nào nó được coi là giống nhau? Tên? Kích thước? Tổng kiểm tra? Đối với tôi nó phải là tổng kiểm tra nhưng nếu hiệu suất là mối quan tâm thực sự thì đây có thể không phải là lựa chọn "tốt nhất". Khi bạn đã gắn thẻ Powershell, bạn có thể sử dụng Đường dẫn kiểm tra để xem tệp có tồn tại theo đường dẫn hay không, nhưng tôi sẽ đề nghị bạn thực sự muốn xem xét tổng kiểm tra của tệp. Tất nhiên, để có được tổng kiểm tra, điều này sẽ có một số tác động về hiệu suất so với việc chỉ kiểm tra tên tệp / đường dẫn không yêu cầu mở tệp. Xác nhận đây là bước đầu tiên tôi muốn đề xuất.
HelpingHand

Câu trả lời:


1

Bạn có thể dẫn các kết quả của một GCI đệ quy của nguồn, kiểm tra xem Thư mục hoặc Tệp của nó có sử dụng đối tượng này để kiểm tra đường dẫn để kiểm tra xem có trong thư mục đích hay không.

cái gì đó như ...

   # 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]"

Nếu đường dẫn thử nghiệm trên tệp thành công nhưng bạn có các tệp có cùng tên nhưng dấu thời gian khác nhau thì bạn sẽ cần phải thực hiện một số loại so sánh giữa các tệp hoặc kiểm tra tệp lần cuối như thế này

If ($_.LastWriteTime -gt ((Join-Path $dest $_.FullName.SubString($src.Length)).LastWriteTime)){ $_ | Copy-Item  -Destination {Join-Path $dest $_.FullName.Substring($src.length) }}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.