Spostamento di più file in quelli con nome corrispondente in un altro disco in PowerShell

Aug 16 2020

Stavo scaricando un enorme torrent (1.2tb con oltre 6000 cartelle) diviso in 2 parti, quindi ho posizionato la seconda parte nel luogo progettato e non è stato un problema poiché la cartella principale del torrent è esattamente ciò di cui avevamo bisogno. La cartella principale della prima parte è stata nominata con un nome torrent generico invece del nome di cui avevo bisogno, quindi invece di rinominare il nome torrent in "sorgente", che penso avrebbe funzionato e rinominato il nome attualmente generico in "sorgente". Nella scheda file ho selezionato tutti i file e ho fatto clic con il pulsante destro del mouse> riposizionali tutti e bittorrent ha semplicemente spostato tutti i file nella stessa directory, senza alcuna sottocartella, creando un pasticcio.

Quindi ho un backup non finito di questo torrent e i file sono a posto, quindi la mia idea era usare il nome non finito, abbinarlo a quelli finiti e mettere quelli finiti nella cartella del percorso del nome corrispondente non finito. Spero sia stato chiaro.

Ho provato a risolverlo usando PowerShell, ma non so molto, quindi mi è venuto in mente e non succede nulla, qualcosa non va. Qualcuno conosce una soluzione?

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

Risposte

derekbaker783 Aug 16 2020 at 19:28

Se capisco correttamente il tuo intento, lo script seguente realizzerà il tuo obiettivo, supponendo che il tuo obiettivo sia copiare i file da una directory appiattita in alcune directory (potenzialmente) nidificate in modo che i file in arrivo sovrascrivano i file con nomi corrispondenti.

Le prestazioni O (n ^ 2) dei cicli annidati potrebbero essere migliorate con una ricerca ordinata e più efficiente.

Dovresti modificare i parametri dello script per riflettere il tuo 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
        }
    }
}