การย้ายไฟล์หลายไฟล์เพื่อจับคู่ชื่อในดิสก์อื่นใน PowerShell

Aug 16 2020

ฉันกำลังดาวน์โหลด torrent ขนาดใหญ่ (1.2tb ที่มีมากกว่า 6000 โฟลเดอร์) แบ่งออกเป็น 2 ส่วนดังนั้นฉันจึงวางส่วนที่ 2 ไว้ในตำแหน่งที่ออกแบบไว้และมันก็ไม่ใช่ปัญหาเนื่องจาก master-folder ของ torrent เป็นสิ่งที่จำเป็น โฟลเดอร์หลักส่วนที่ 1 ได้รับการตั้งชื่อด้วยชื่อ torrent ทั่วไปแทนที่จะเป็นชื่อที่ฉันต้องการดังนั้นแทนที่จะเปลี่ยนชื่อ torrent เป็น "source" ซึ่งฉันคิดว่าน่าจะได้ผลและเปลี่ยนชื่อทั่วไปในปัจจุบันเป็น "source" ในแท็บไฟล์ฉันเลือกไฟล์ทั้งหมดแล้วคลิกขวา> ย้ายตำแหน่งไฟล์ทั้งหมดและ bittorrent ก็ย้ายไฟล์ทั้งหมดไปยังไดเร็กทอรีเดียวกันโดยไม่ต้องมีโฟลเดอร์ย่อยและสร้างความยุ่งเหยิง

ดังนั้นฉันจึงมีการสำรองข้อมูล torrent นี้ที่ยังไม่เสร็จสิ้นและไฟล์ก็อยู่ในตำแหน่งดังนั้นความคิดของฉันคือใช้ชื่อที่ยังไม่เสร็จจับคู่กับไฟล์ที่เสร็จแล้วและใส่ไฟล์ที่เสร็จแล้วลงในโฟลเดอร์พา ธ ของชื่อที่ตรงกันที่ยังไม่เสร็จสิ้น ฉันหวังว่ามันจะชัดเจน

ฉันพยายามแก้ไขปัญหานี้โดยใช้ PowerShell แต่ฉันไม่รู้อะไรมากดังนั้นฉันจึงคิดสิ่งนี้ขึ้นมาและไม่มีอะไรเกิดขึ้นมีบางอย่างผิดปกติ ใครรู้วิธีแก้ปัญหา?

$itemlistA = Get-ChildItem -Path "D:\BitTorrent\" | ForEach-Object { $objnameA = $_.Name $objPathA = $_.FullName } $itemlistB = Get-ChildItem -Path "E:\DesiredPath\" -recurse | 
ForEach-Object{
    $objnameB = $_.Name
    $objPathB = $_.FullName
}

ForEach-Object{ 
    if($objnameA -eq $objnameB){
        Copy-Item -path $objPathA -Destination $objPathB
        Write-Host "ffff    Object ($objnameA) new Path ($objPathB)     ffff"
    }
}

คำตอบ

derekbaker783 Aug 16 2020 at 19:28

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

ประสิทธิภาพ O (n ^ 2) ของลูปที่ซ้อนกันสามารถปรับปรุงได้ด้วยการจัดเรียงและการค้นหาที่มีประสิทธิภาพมากขึ้น

คุณต้องแก้ไขพารามิเตอร์ของสคริปต์เพื่อให้สอดคล้องกับสภาพแวดล้อมของคุณเอง

param(
    $pathToFiles = "$PSScriptRoot\BitTorrent\",
    $desiredPath = "$PSScriptRoot\DesiredPath\"
)

$itemlistA = Get-ChildItem -Path $pathToFiles | Select-Object -Property Name, FullName

$itemlistB = Get-ChildItem -Path $desiredPath -Recurse | Select-Object -Property Name, FullName

foreach ($fileA in $itemlistA) {
    foreach ($fileB in $itemListB) {
        if ($fileB.Name -eq $fileA.Name) {
            Copy-Item -path $fileA.FullName -Destination $fileB.FullName -Verbose
            break
        }
    }
}