PowerShell में एक और डिस्क में नाम वाले लोगों के लिए कई फ़ाइलों को ले जाना

Aug 16 2020

मैं 2 भागों में विभाजित एक विशाल टोरेंट (6000 से अधिक फ़ोल्डरों वाला 1.2tb) डाउनलोड कर रहा था, इसलिए मैंने 2 भाग को डिज़ाइन किए गए स्थान पर रखा और यह कोई समस्या नहीं थी क्योंकि टोरेंट का मास्टर-फ़ोल्डर वास्तव में वही था जिसकी आवश्यकता थी। प्रथम भाग के मास्टर-फोल्डर को मेरे द्वारा आवश्यक नाम के बजाय कुछ सामान्य टॉरेंट नाम के साथ नामित किया गया था, इसलिए टॉरेंट नाम को "स्रोत" में बदलने के बजाय, जो मुझे लगता है कि काम किया होगा और वर्तमान में सामान्य नाम को "स्रोत" नाम दिया है। फ़ाइलों के टैब में मैंने सभी फ़ाइलों को चुना और राइट-क्लिक करें> उन सभी को स्थानांतरित करें और बिटोरेंट बस सभी फाइलों को उसी निर्देशिका में स्थानांतरित कर दिया, बिना किसी सबफ़ोल्डर के, और एक गड़बड़ बनाई।

इसलिए मेरे पास इस टोरेंट का अन-फिनिश्ड बैकअप है और फाइलें जगह पर हैं, इसलिए मेरा विचार अन-फिनिश्ड किसी के नाम का इस्तेमाल कर रहा था, तैयार लोगों के साथ मैच कर रहा था और तैयार लोगों को अन-फिनिश्ड मैचिंग के नाम के फोल्डर में डाल दिया था। मुझे उम्मीद है कि स्पष्ट था।

मैंने इसे 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
        }
    }
}