Déplacement de plusieurs fichiers vers des noms correspondants dans un autre disque dans PowerShell

Aug 16 2020

Je téléchargeais un énorme torrent (1,2 To avec plus de 6000 dossiers) divisé en 2 parties, j'ai donc placé la 2ème partie à l'endroit prévu et ce n'était pas un problème puisque le dossier maître du torrent est exactement ce qu'il fallait. Le dossier principal de la première partie a été nommé avec un nom de torrent générique au lieu du nom dont j'avais besoin, donc au lieu de renommer le nom du torrent en "source", ce qui, je pense, aurait fonctionné et renommé le nom générique actuel en "source". Dans l'onglet Fichiers, j'ai sélectionné tous les fichiers et un clic droit> les déplacer tous et bittorrent a simplement déplacé tous les fichiers dans le même répertoire, sans aucun sous-dossier, et créé un désordre.

J'ai donc une sauvegarde non terminée de ce torrent et les fichiers sont en place, donc mon idée était d'utiliser le nom de celui qui n'est pas terminé, de faire correspondre les noms finis et de mettre les fichiers finis dans le dossier de chemin du nom correspondant non terminé. J'espère que c'était clair.

J'ai essayé de résoudre ce problème en utilisant PowerShell, mais je ne sais pas grand-chose, alors j'ai trouvé cela et rien ne se passe, quelque chose ne va pas. Quelqu'un connaît une solution?

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

Réponses

derekbaker783 Aug 16 2020 at 19:28

Si je comprends bien votre intention, le script ci-dessous atteindra votre objectif, en supposant que votre objectif est de copier des fichiers d'un répertoire aplati dans certains répertoires (potentiellement) imbriqués afin que les fichiers entrants écrasent les fichiers avec des noms correspondants.

Les performances O (n ^ 2) des boucles imbriquées pourraient être améliorées avec un tri et une recherche plus efficace.

Vous devrez modifier les paramètres du script pour refléter votre propre environnement.

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