Làm cách nào tôi có thể sao chép một thư mục, ghi đè lên nội dung của nó nếu nó tồn tại bằng Powershell?


9

Tôi có một thư mục Nguồn với một số tệp trong đó, tôi muốn sao chép vào thư mục Đích. Đích có thể tồn tại và nó có thể có tệp trong đó. Bất kỳ tệp nào có cùng tên với các tệp trong Nguồn sẽ được ghi đè.

Nếu tôi chạy cái này trong Powershell:

Copy-Item Source Destination -Force -Recurse
Copy-Item Source Destination -Force -Recurse
Copy-Item Source Destination -Force -Recurse

Sau đó, dòng đầu tiên tạo thư mục .\Destinationvà sao chép .\Sourcevào đó, đó là những gì tôi muốn lặp lại cho lần tiếp theo. Tuy nhiên, thay vào đó, dòng thứ hai sao chép .\Sourcevào .\Destinationthư mục mới (tạo .\Destination\Source), sau đó dòng thứ ba sẽ ghi đè .\Destination\Sourcelại.

Làm thế nào tôi có thể làm cho nó hoạt động như trong trường hợp đầu tiên mọi lúc? Đó là, ghi đè .\Destinationthay vì sao chép vào nó?


Bạn có thể làm rõ? bạn muốn sao chép nội dung của "nguồn" vào "đích"? và không sao chép thư mục "nguồn" vào "đích"?
BroScience

Vâng đúng rồi. Thư mục "đích" có thể không tồn tại, vì vậy tôi muốn nó được tạo nếu nó không thoát.
Douglas

Nó có thể là giá trị xem xét robocopy như là một thay thế. Bạn vẫn có thể gọi nó từ powershell nếu bạn cần. Nó sẽ xử lý if existsvấn đề một cách dễ dàng và sẽ không yêu cầu bạn phải nhanh chóng xóa đệ quy đích của mình, điều này đi kèm với những nguy hiểm của chính nó.
Jeremy

Câu hỏi SO liên quan chặt chẽ: stackoverflow.com/q/47964451/45375
mkuity0

Câu trả lời:


7

Vì vậy, vấn đề là

cp -r -fo foo bar

chỉ hoạt động nếu barkhông tồn tại và

cp -r -fo foo/* bar

chỉ hoạt động nếu bartồn tại. Vì vậy, để làm việc xung quanh, bạn cần đảm bảo bartồn tại trước khi làm bất cứ điều gì

md -f bar
cp -r -fo foo/* bar

3

Nếu bạn chỉ muốn sao chép nội dung của thư mục "nguồn", hãy sử dụng

copy-item .\source\* .\destination -force -recurse

1
Điều này chỉ hoạt động nếu destinationđã tồn tại.
Steven Penny

3

Câu trả lời của Steven Penny https://superuser.com/a/742719/126444 không xóa nội dung gốc của thư mục đích, chỉ thêm vào đó. Tôi cần thay thế hoàn toàn thư mục đích bằng nội dung của nguồn và tạo 2 chức năng:

function CopyToEmptyFolder($source, $target )
{
    DeleteIfExistsAndCreateEmptyFolder($target )
    Copy-Item $source\* $target -recurse -force
}
function DeleteIfExistsAndCreateEmptyFolder($dir )
{
    if ( Test-Path $dir ) {
    #http://stackoverflow.com/questions/7909167/how-to-quietly-remove-a-directory-with-content-in-powershell/9012108#9012108
           Get-ChildItem -Path  $dir -Force -Recurse | Remove-Item -force -recurse
           Remove-Item $dir -Force

    }
    New-Item -ItemType Directory -Force -Path $dir
}

1

Hãy nói rằng bạn có cấu trúc thư mục sau đây

  • nguồn gốc

    • thư mục_a
      • a.txt
      • b.txt
      • c.txt
    • thư mục_b
      • a.txt
      • b.txt

    Trong thư mục gốc, bạn có thể đạt được kết quả bạn muốn bằng chuỗi lệnh sau:

    $files = gci ./folder_b -name
    cp ./folder_a/*.txt -Exclude $files ./folder_b

Chỉ c.txt sẽ được sao chép

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.