Mover varios archivos a los que coinciden con los nombres en otro disco en PowerShell

Aug 16 2020

Estaba descargando un enorme torrent (1.2tb con más de 6000 carpetas) dividido en 2 partes, así que coloqué la segunda parte en el lugar diseñado y no fue un problema ya que la carpeta maestra del torrent es exactamente lo que se necesitaba. La primera parte de la carpeta maestra fue nombrada con un nombre de torrent genérico en lugar del nombre que necesitaba, así que en lugar de cambiar el nombre del torrent a "fuente", creo que habría funcionado y renombrado el nombre genérico actual a "fuente". En la pestaña de archivos, seleccioné todos los archivos y hice clic derecho> reubicarlos todos y bittorrent simplemente movió todos los archivos al mismo directorio, sin ninguna subcarpeta, y creó un desastre.

Así que tengo una copia de seguridad sin terminar de este torrent y los archivos están en su lugar, por lo que mi idea fue usar el nombre sin terminar, combinar con los terminados y poner los terminados en la carpeta de ruta del nombre coincidente sin terminar. Espero que haya quedado claro.

Traté de resolver esto usando PowerShell, pero no sé mucho, así que se me ocurrió esto y no pasa nada, algo está mal. ¿Alguien conoce una solución?

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

Respuestas

derekbaker783 Aug 16 2020 at 19:28

Si entiendo correctamente su intención, el siguiente script logrará su objetivo, asumiendo que su objetivo es copiar archivos de un directorio plano en algunos directorios (potencialmente) anidados para que los archivos entrantes sobrescriban los archivos con nombres coincidentes.

El rendimiento de O (n ^ 2) de los bucles anidados podría mejorarse con una búsqueda ordenada y más eficiente.

Debería editar los parámetros del script para reflejar su propio entorno.

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