Mover varios archivos a los que coinciden con los nombres en otro disco en PowerShell
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
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
}
}
}