Перемещение нескольких файлов в файлы с совпадающими именами на другом диске в PowerShell

Aug 16 2020

Я скачивал огромный торрент (1,2 ТБ с более чем 6000 папок), разделенный на 2 части, поэтому я поместил вторую часть на предназначенное место, и это не было проблемой, так как главная папка торрента - это именно то, что было нужно. Основная папка 1-й части была названа с помощью некоторого общего имени торрента вместо имени, которое мне было нужно, поэтому вместо переименования имени торрента в «источник», что, я думаю, сработало бы, и переименовал текущее общее имя в «источник». На вкладке файлов я выбрал все файлы и щелкнул правой кнопкой мыши> переместил их все, а BitTorrent просто переместил все файлы в тот же каталог, без подпапок, и создал беспорядок.

Итак, у меня есть незавершенная резервная копия этого торрента, и файлы находятся на своих местах, поэтому моя идея заключалась в том, чтобы использовать незавершенное имя, сопоставить с готовыми и поместить готовые в папку пути незавершенного совпадающего имени. Надеюсь, это было ясно.

Я попытался решить эту проблему с помощью 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
        }
    }
}