Tengo dos estructuras de directorio con subcarpetas y archivos. Quiero eliminar cualquier archivo que esté duplicado en el segundo directorio. Y luego elimine las carpetas vacías que se encuentran en el segundo directorio. Creo que tengo la tubería configurada correctamente, simplemente no estoy seguro de cómo eliminar los archivos y, si la carpeta está vacía, la carpeta. El problema parece ser que no puedo determinar la estructura de la carpeta del archivo que estaba duplicado en el comando de eliminación.

$Folder1 = Get-ChildItem -Path C:\Temp\Folder1 -Recurse 
$Folder2 = Get-ChildItem -Path C:\Temp\Folder2 -Recurse

Compare-Object -ReferenceObject $Folder1 -DifferenceObject $Folder2 -IncludeEqual |
    Where-Object {$_.SideIndicator -eq "=="} | 
    ForEach-Object { 
        Remove-Item "$($_.FullName)" 
    }
2
Keith Locke 12 ene. 2017 a las 16:33
2
¿Por qué no usar robocopy?
 – 
Bill_Stewart
12 ene. 2017 a las 16:46

1 respuesta

La mejor respuesta

Ya casi está allí, pero el objeto que desea usar está anidado en la propiedad InputObject de la salida que obtiene de Compare-Object.

Cambie esto:

Remove-Item "$($_.FullName)"

En esto:

Remove-Item $_.InputObject.FullName

Tenga en cuenta que los duplicados se eliminarán del argumento del objeto de referencia (es decir, $Folder1). Si desea que se eliminen de $Folder2, debe cambiar los argumentos:

Compare-Object -ReferenceObject $Folder2 -DifferenceObject $Folder1 -IncludeEqual |
    Where-Object ...

Tenga en cuenta también que este enfoque solo compara nombres de archivos, nada más. Si necesita comprobar si los archivos son realmente iguales o no, probablemente sea mejor que genere la lista de archivos con robocopy, como @ Bill_Stewart.

$folder1 = 'C:\Temp\Folder1'
$folder2 = 'C:\Temp\Folder2'

& robocopy.exe "$folder2" "$folder1" /s /l /is /xn /xo /xx /xl /njh /njs /ns /nc /ndl /np |
    ForEach-Object { $_.Trim() } |
    Remove-Item

Nuevamente, debe usar la carpeta de la que desea eliminar archivos como referencia para la comparación.

2
Community 23 may. 2017 a las 15:24