Mover vários arquivos para nomes correspondentes em outro disco no PowerShell

Aug 16 2020

Eu estava baixando um torrent enorme (1,2 TB com mais de 6000 pastas) dividido em 2 partes, então coloquei a 2ª parte no local projetado e não foi um problema, já que a pasta master do torrent é exatamente o que era necessário. A pasta-mestre da 1ª parte foi nomeada com algum nome de torrent genérico em vez do nome que eu precisava, então em vez de renomear o nome do torrent para "fonte", o que eu acho que funcionaria e renomeie o nome genérico atual para "fonte". Na guia de arquivos, selecionei todos os arquivos e cliquei com o botão direito> realocar todos eles e o bittorrent simplesmente moveu todos os arquivos para o mesmo diretório, sem nenhuma subpasta, e criou uma bagunça.

Então, eu tenho um backup não concluído deste torrent e os arquivos estão no lugar, então minha ideia era usar o nome do não finalizado, combinar com os finalizados e colocar os finalizados na pasta de caminho do nome correspondente não finalizado. Espero que tenha ficado claro.

Tentei resolver isso usando o PowerShell, mas não sei muito, então vim com isso e nada acontece, algo está errado. Alguém conhece uma solução?

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

Respostas

derekbaker783 Aug 16 2020 at 19:28

Se estou entendendo sua intenção corretamente, o script a seguir cumprirá seu objetivo, presumindo que seu objetivo seja copiar arquivos de um diretório achatado em alguns diretórios (potencialmente) aninhados para que os arquivos de entrada substituam os arquivos com nomes correspondentes.

O desempenho O (n ^ 2) dos loops aninhados pode ser melhorado com uma classificação e uma pesquisa mais eficiente.

Você precisaria editar os parâmetros do script para refletir seu próprio ambiente.

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