ฉันจะคัดลอกไดเรกทอรีเขียนทับเนื้อหาถ้ามีอยู่โดยใช้ Powershell ได้อย่างไร


9

ฉันมีไดเรกทอรีที่มาพร้อมกับไฟล์บางไฟล์ซึ่งฉันต้องการคัดลอกไปยังโฟลเดอร์ปลายทาง ปลายทางอาจมีอยู่และอาจมีไฟล์อยู่แล้ว ไฟล์ใด ๆ ที่มีชื่อเดียวกันกับที่อยู่ในซอร์สควรถูกเขียนทับ

ถ้าฉันเรียกใช้สิ่งนี้ใน Powershell:

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

จากนั้นบรรทัดแรกจะสร้างโฟลเดอร์.\Destinationและคัดลอก.\Sourceลงไปซึ่งเป็นสิ่งที่ฉันต้องการทำซ้ำในครั้งต่อไป อย่างไรก็ตามบรรทัดที่สองคัดลอก.\Sourceไปยัง.\Destinationโฟลเดอร์ใหม่(สร้าง.\Destination\Source) แทนจากนั้นบรรทัดที่สามจะเขียนทับ.\Destination\Sourceอีกครั้ง

ฉันจะทำให้มันเหมือนในกรณีแรกตลอดเวลาได้อย่างไร นั่นคือเขียนทับ.\Destinationแทนที่จะคัดลอกลงไปหรือไม่


คุณช่วยอธิบายได้ไหม คุณต้องการคัดลอกเนื้อหาของ "แหล่งที่มา" ใน "ปลายทาง" หรือไม่ และไม่คัดลอกโฟลเดอร์ "แหล่ง" ลงใน "ปลายทาง" หรือไม่
BroScience

ใช่ที่ถูกต้อง. อาจไม่มีโฟลเดอร์ "ปลายทาง" ดังนั้นฉันต้องการให้สร้างหากไม่ออก
Douglas

มันอาจจะคุ้มค่าหากพิจารณาrobocopyเป็นทางเลือก คุณยังสามารถโทรหาได้จาก PowerShell หากคุณต้องการ มันจะจัดการกับif existsปัญหาได้อย่างง่ายดายและไม่ต้องการให้คุณบังคับลบปลายทางของคุณซ้ำด้วยซ้ำซึ่งมาพร้อมกับอันตรายของตัวเอง
Jeremy

คำถาม SO ที่เกี่ยวข้องอย่างใกล้ชิด: stackoverflow.com/q/47964451/45375
mklement0

คำตอบ:


7

ดังนั้นปัญหาก็คือ

cp -r -fo foo bar

ใช้งานได้หากbarไม่มีอยู่และ

cp -r -fo foo/* bar

ใช้งานได้หากbarมีอยู่เท่านั้น ดังนั้นในการหลีกเลี่ยงคุณต้องทำให้แน่ใจว่าbarมีอยู่ก่อนที่จะทำอะไร

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

3

หากคุณต้องการคัดลอกเนื้อหาของโฟลเดอร์ "source" เท่านั้น

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

1
ใช้งานได้หากdestinationมีอยู่แล้วเท่านั้น
Steven Penny

3

คำตอบของ Steven Penny https://superuser.com/a/742719/126444จะไม่ลบเนื้อหาต้นฉบับของไดเรกทอรีเป้าหมายเพียงต่อท้าย ฉันต้องการแทนที่โฟลเดอร์เป้าหมายอย่างสมบูรณ์ด้วยเนื้อหาของซอร์สและสร้าง 2 ฟังก์ชัน:

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

สมมติว่าคุณมีโครงสร้างของไดเรคทอรีดังต่อไปนี้

  • ราก

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

    ในโฟลเดอร์รูทคุณสามารถบรรลุผลลัพธ์ที่คุณต้องการตามลำดับคำสั่งต่อไปนี้:

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

c.txt เท่านั้นที่จะถูกคัดลอก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.