¿Cómo difiero dos carpetas en Windows Powershell?


11

Estoy tratando de encontrar diferencias en el contenido de dos estructuras de carpetas con Windows Powershell. He utilizado el siguiente método para asegurarme de que los nombres de los archivos sean los mismos, pero este método no me dice si el contenido de los archivos es el mismo:

$firstFolder = Get-ChildItem -Recurse folder1
$secondFolder = Get-ChildItem -Recurse folder2
Compare-Object -ReferenceObject $firstFolder -DifferenceObject $secondFolder

La técnica descrita en esta pregunta de ServerFault funciona para diferenciar un solo archivo, pero estas carpetas contienen cientos de archivos en una variedad de profundidades.

La solución no necesariamente necesita decirme qué específicamente en los archivos es diferente, solo que lo son. No me interesan las diferencias en los metadatos, como la fecha, que ya sé que son diferentes.

Respuestas:


15

Si desea ajustar la comparación en un bucle, tomaría el siguiente enfoque:

$folder1 = "C:\Users\jscott"
$folder2 = "C:\Users\public"

# Get all files under $folder1, filter out directories
$firstFolder = Get-ChildItem -Recurse $folder1 | Where-Object { -not $_.PsIsContainer }

$firstFolder | ForEach-Object {

    # Check if the file, from $folder1, exists with the same path under $folder2
    If ( Test-Path ( $_.FullName.Replace($folder1, $folder2) ) ) {

        # Compare the contents of the two files...
        If ( Compare-Object (Get-Content $_.FullName) (Get-Content $_.FullName.Replace($folder1, $folder2) ) ) {

            # List the paths of the files containing diffs
            $_.FullName
            $_.FullName.Replace($folder1, $folder2)

        }
    }   
}

Tenga en cuenta que esto ignorará los archivos que no existen en ambos $folder1 y $folder2.


5

Tomé la respuesta de jscott y la expandí para generar los archivos que están presentes en uno pero no en el otro para aquellos que están interesados ​​en ese tipo de funcionalidad. Tenga en cuenta que también muestra el progreso realizado, ya que fue difícil para mí ver eso dadas las enormes carpetas con no muchas diferencias. Parecía que me habían colgado el guión. Aquí está el código de PowerShell para eso:

$folder1 = "C:\Folder1"
$folder2 = "C:\Folder2"

# Get all files under $folder1, filter out directories
$firstFolder = Get-ChildItem -Recurse $folder1 | Where-Object { -not $_.PsIsContainer }

$failedCount = 0
$i = 0
$totalCount = $firstFolder.Count
$firstFolder | ForEach-Object {
    $i = $i + 1
    Write-Progress -Activity "Searching Files" -status "Searching File  $i of     $totalCount" -percentComplete ($i / $firstFolder.Count * 100)
    # Check if the file, from $folder1, exists with the same path under $folder2
    If ( Test-Path ( $_.FullName.Replace($folder1, $folder2) ) ) {
        # Compare the contents of the two files...
        If ( Compare-Object (Get-Content $_.FullName) (Get-Content $_.FullName.Replace($folder1, $folder2) ) ) {
            # List the paths of the files containing diffs
            $fileSuffix = $_.FullName.TrimStart($folder1)
            $failedCount = $failedCount + 1
            Write-Host "$fileSuffix is on each server, but does not match"
        }
    }
    else
    {
        $fileSuffix = $_.FullName.TrimStart($folder1)
        $failedCount = $failedCount + 1
        Write-Host "$fileSuffix is only in folder 1"
    }
}

$secondFolder = Get-ChildItem -Recurse $folder2 | Where-Object { -not $_.PsIsContainer }

$i = 0
$totalCount = $secondFolder.Count
$secondFolder | ForEach-Object {
    $i = $i + 1
    Write-Progress -Activity "Searching for files only on second folder" -status "Searching File  $i of $totalCount" -percentComplete ($i / $secondFolder.Count * 100)
    # Check if the file, from $folder2, exists with the same path under $folder1
    If (!(Test-Path($_.FullName.Replace($folder2, $folder1))))
    {
        $fileSuffix = $_.FullName.TrimStart($folder2)
        $failedCount = $failedCount + 1
        Write-Host "$fileSuffix is only in folder 2"
    }
}

¿Por qué extraerías el contenido real de un archivo al llamar a Compare-Object? Eso es lo que hace Compare-Object. technet.microsoft.com/en-us/library/…
Casper Leon Nielsen

1

Simplemente envuelva un bucle alrededor de la respuesta correcta de su pregunta vinculada que ya respondió esto, y recorra el árbol de directorios comparando cada archivo con el mismo nombre.

/ Editar: si esa es realmente tu pregunta, es más apropiada para SO, donde pareces ser un colaborador habitual. Estás haciendo una pregunta de programación. Entiendo que lo estás haciendo para un propósito de tipo sysadmin, en cuyo caso, te diría que uses una herramienta especialmente diseñada como WinDiff.


2
OK, este sitio no es apropiado para las preguntas tipo "Dame el codez". Si necesita comenzar a aprender a hacer bucles en Powershell, compre un libro o busque tutoriales en línea; Hay muchos.
mfinni

2
Creo que te despertaste en el lado equivocado de la cama. No soy un usuario habitual de Powershell. En mi pregunta he demostrado una técnica que estoy intentando actualmente y un enlace a una pregunta que contiene información adicional útil para mi problema. No sé cómo combinar las dos técnicas, que es mi problema y la razón por la que hice esta pregunta. También es una pregunta que no he podido responder usando las búsquedas de Google. Si no va a ser útil, considere eliminar su respuesta.
David Smith

2
@BigDave Literalmente el primer resultado para PowerShell loop through filesen Google . vamos, ¿un poco de esfuerzo de tu parte?
voretaq7

2
@ voretaq7 Creo que ustedes no me entienden como usuario de PowerShell. Hice esa búsqueda en Google, intenté esa técnica y no tuve éxito. Traté de explicar dónde estoy en la pregunta anterior. La pregunta a la que se vincula funciona en un solo conjunto de archivos. Tengo dos conjuntos que necesito comparar, nombre a nombre. Realmente no estoy tratando de ser flojo aquí. Sé cómo hacer un bucle y sé cómo comparar. ¿Cómo hago un bucle y comparo dos conjuntos?
David Smith

1
Creo que hacer esto con PS es un pequeño gran proyecto. Sin embargo, WinMerge (pensó que era WinDiff, tonto) es realmente una gran herramienta si vas a hacer esto muy a menudo. Está literalmente construido para el trabajo. Pruébalo, la descarga es gratuita. Tiene descomponedores para la mayoría de los tipos de archivos, y hace un gran trabajo de resaltado, incluidas las opciones sobre cómo desea manejar los espacios en blanco.
mfinni

0

Hacer esto:

compare (Get-ChildItem D:\MyFolder\NewFolder) (Get-ChildItem \\RemoteServer\MyFolder\NewFolder)

E incluso recursivamente:

compare (Get-ChildItem -r D:\MyFolder\NewFolder) (Get-ChildItem -r \\RemoteServer\MyFolder\NewFolder)

e incluso es difícil de olvidar :)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.