Bagaimana saya bisa menyalin direktori, menimpa isinya jika ada menggunakan Powershell?

9

Saya memiliki Sumber direktori dengan beberapa file di dalamnya, yang ingin saya salin ke folder Destination. Tujuan mungkin ada, dan mungkin sudah ada file di dalamnya. File apa pun dengan nama yang sama dengan yang ada di Sumber harus ditimpa ulang.

Jika saya menjalankan ini di Powershell:

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

Lalu baris pertama membuat folder .\Destinationdan menyalinnya .\Source, itulah yang ingin saya ulangi untuk kali berikutnya. Namun, baris kedua akan menyalin .\Sourceke .\Destinationfolder baru (membuat .\Destination\Source), kemudian baris ketiga menimpa .\Destination\Sourcelagi.

Bagaimana saya bisa membuatnya bertindak seperti dalam kasus pertama sepanjang waktu? Artinya, menimpa .\Destinationalih-alih menyalin ke dalamnya?

Douglas
sumber
Bisakah Anda mengklarifikasi? Anda ingin menyalin konten "sumber" ke "tujuan"? dan tidak menyalin folder "sumber" ke "tujuan"?
BroScience
Ya itu benar. Folder "tujuan" mungkin tidak ada, jadi saya ingin membuatnya jika tidak keluar.
Douglas
Mungkin patut mempertimbangkan robocopy sebagai alternatif. Anda masih dapat memanggilnya dari PowerShell jika perlu. Ini akan menangani if existsmasalah dengan mudah dan tidak akan mengharuskan Anda untuk secara paksa menghapus tujuan Anda dengan baik, yang datang dengan bahaya sendiri.
Jeremy
Pertanyaan SO yang terkait erat: stackoverflow.com/q/47964451/45375
mklement0

Jawaban:

7

Jadi masalahnya adalah itu

cp -r -fo foo bar

hanya berfungsi jika bartidak ada dan

cp -r -fo foo/* bar

hanya berfungsi jika barada. Jadi untuk mengatasinya, Anda perlu memastikan barada sebelum melakukan sesuatu

md -f bar
cp -r -fo foo/* bar
Steven Penny
sumber
3

Jika Anda hanya ingin menyalin konten dari folder "sumber" gunakan

copy-item .\source\* .\destination -force -recurse
BroScience
sumber
1
Ini hanya berfungsi jika destinationsudah ada.
Steven Penny
3

Jawaban Steven Penny https://superuser.com/a/742719/126444 tidak menghapus konten asli dari direktori target, hanya menambahkannya. Saya perlu mengganti folder target sepenuhnya dengan konten sumber dan membuat 2 fungsi:

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
}
Michael Freidgeim
sumber
1

Katakanlah Anda memiliki struktur Direktori berikut

  • akar

    • folder_a
      • a.txt
      • b.txt
      • c.txt
    • folder_b
      • a.txt
      • b.txt

    Di folder Root Anda dapat mencapai hasil yang Anda inginkan dengan urutan perintah berikut:

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

Hanya c.txt yang akan disalin

kb_sou
sumber