Przenoszenie wielu plików do pasujących nazw na innym dysku w programie PowerShell

Aug 16 2020

Ściągałem ogromny torrent (1,2 TB z ponad 6000 folderów) podzielony na 2 części, więc umieściłem drugą część w zaprojektowanym miejscu i nie było to problemem, ponieważ główny folder torrenta jest dokładnie tym, co było potrzebne. Główny folder pierwszej części został nazwany jakąś ogólną nazwą torrenta zamiast nazwy, której potrzebowałem, więc zamiast zmienić nazwę torrenta na „źródło”, co, jak sądzę, zadziałałoby, i zmieniono nazwę obecnie ogólnej na „źródło”. Na karcie plików wybrałem wszystkie pliki i kliknąłem prawym przyciskiem myszy> przenieś je wszystkie, a bittorrent po prostu przeniósł wszystkie pliki do tego samego katalogu, bez żadnego podfolderu, i stworzył bałagan.

Mam więc nieukończoną kopię zapasową tego torrenta, a pliki są na swoim miejscu, więc moim pomysłem było użycie nieukończonego imienia, dopasowanie do gotowych i umieszczenie gotowych w folderze ścieżki nieukończonej pasującej nazwy. Mam nadzieję, że to było jasne.

Próbowałem rozwiązać ten problem za pomocą PowerShell, ale niewiele wiem, więc wymyśliłem to i nic się nie dzieje, coś jest nie tak. Czy ktoś zna rozwiązanie?

$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"
    }
}

Odpowiedzi

derekbaker783 Aug 16 2020 at 19:28

Jeśli dobrze rozumiem twój zamiar, poniższy skrypt osiągnie twój cel, zakładając, że Twoim celem jest skopiowanie plików z spłaszczonego katalogu do niektórych (potencjalnie) zagnieżdżonych katalogów, aby przychodzące pliki nadpisały pliki o pasujących nazwach.

Wydajność O (n ^ 2) zagnieżdżonych pętli można poprawić dzięki sortowaniu i bardziej wydajnemu wyszukiwaniu.

Będziesz musiał edytować parametry skryptu, aby odzwierciedlić własne środowisko.

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
        }
    }
}