Búsqueda de sitios web

Comparar el contenido de dos carpetas en PowerShell [2 formas]


Comparación del contenido de dos carpetas en PowerSHell

PowerShell es una herramienta poderosa que puede ayudar a los administradores de sistemas y profesionales de TI a automatizar tareas rutinarias, y una de las tareas comunes es comparar el contenido de dos carpetas. Esto puede resultar útil para identificar diferencias entre dos versiones de directorio o encontrar archivos faltantes en una copia de seguridad.

Para continuar, es fundamental conocer los elementos del directorio actual. Por ejemplo, el directorio actual para esta demostración se encuentra en C:\Test1 y C:\Test2.

  • C:\Test1 consta de dos archivos de texto y carpetas denominadas FolderA y FolderB. Los elementos del directorio incluyen File1.txt y File2.txt.

    • C:\Test1\FolderA: contiene un archivo de texto (File4.txt).
    • C:\Test1\FolderB: tiene un archivo de texto (File5.txt y File7.txt).
  • C:\Test2 consta de dos archivos de texto y carpetas denominadas FolderC y FolderD. Los elementos del directorio incluyen File1.txt y File3.txt.

    • C:\Test2\FolderC: contiene un archivo de texto (File5.txt).
    • C:\Test2\FolderD: también contiene un archivo de texto (File6.txt).

Ahora que conoce los detalles de los directorios, sigamos aprendiendo a comparar el contenido de dos carpetas.

Utilice el cmdlet Compare-Object

Utilice compare-object para comparar dos carpetas en PowerShell. El cmdlet compare-object compara dos conjuntos de datos en PowerShell.

Utilice el cmdlet Comparar objetos:

$folder1 = "C:\Test1"
$folder2 = "C:\Test2"

$folder1Items = Get-ChildItem $folder1 -Recurse
$folder2Items  = Get-ChildItem $folder2 -Recurse

Compare-Object -ReferenceObject $folder1Items -DifferenceObject $folder2Items -Property Name -IncludeEqual

Producción :

Name          SideIndicator
----          -------------
File1.txt      ==
File5.txt      ==
FolderC        =>
FolderD        =>
File3.txt      =>
File6.txt      =>
FolderA        <=
FolderB        <=
File2.txt      <=
File4.txt      <=
File7.txt      <=

En el código anterior, definimos dos carpetas que queremos comparar, $folder1 y $folder2. Primero, el símbolo $ crea una variable en PowerShell. Luego, el cmdlet Compare-Object compara los dos conjuntos de datos.

El ReferenceObject (Get-ChildItem $folder1) especifica el objeto de referencia y el conjunto de datos que se utilizará como base para la comparación. En este caso, estamos usando el cmdlet Get-ChildItem para obtener una lista de archivos y directorios en $folder1 con -Recurse como parámetro. y pasar esa lista al parámetro -ReferenceObject del cmdlet Compare-Object. Esto le indica a PowerShell que use los archivos y directorios en $folder1 como referencia para la comparación.

El parámetro -DifferenceObject del cmdlet Compare-Object le indica a PowerShell que compare los archivos y directorios en $folder2 con los de $folder1 . Finalmente, -Property especifica la propiedad de los objetos que queremos comparar. En este caso, comparamos la propiedad Name de los archivos y directorios de cada carpeta.

El -IncludeEqual especifica que queremos incluir objetos que sean iguales en ambas carpetas en la comparación. De forma predeterminada, el cmdlet Compare-Object solo devuelve objetos que difieren entre los objetos de referencia y de diferencia.

Este resultado indica que hay dos archivos, tres carpetas diferentes y un archivo es el mismo entre dos carpetas. La columna SideIndicator en el resultado muestra de qué lado es exclusivo el archivo o carpeta, <= para el lado izquierdo, => para el lado derecho. y == para ambos.

Teniendo en cuenta la solución anterior, el cmdlet Compare-Object en PowerShell proporciona una forma eficaz y potente de comparar e identificar diferencias entre dos conjuntos de datos. Al especificar los objetos de referencia y de diferencia, la propiedad que queremos comparar y cualquier opción adicional, como incluir objetos que sean iguales en ambos conjuntos de datos, podemos identificar rápida y fácilmente los cambios entre dos carpetas.

Utilice hash MD5

Para comparar el contenido de dos carpetas:

  • Utilice Get-ChildItem para recuperar todos los elementos en el directorio especificado.
  • Utilice Get-FileHash para generar el valor hash MD5 para cada archivo.
  • Utilice dos bucles foreach para iterar sobre los valores hash de ambos directorios.
  • En cada iteración de cada bucle:
  • Utilice Where-Object para filtrar los valores coincidentes e imprimir un mensaje si se cumple la declaración if.

Utilice hash MD5:

$folder1 = "C:\Test1"
$folder2 = "C:\Test2"
$hash1 = Get-ChildItem $folder1 -Recurse | Get-FileHash -Algorithm MD5
$hash2 = Get-ChildItem $folder2 -Recurse | Get-FileHash -Algorithm MD5
foreach ($hash in $hash1) {
    $match = $hash2 | Where-Object { $_.Hash -eq $hash.Hash }
    if ($match) {
        Write-Host "File $($hash.Path) exists in both folders and is identical."
    } else {
        Write-Host "File $($hash.Path) exists only in $folder1."
    }
}
foreach ($hash in $hash2) {
    $match = $hash1 | Where-Object { $_.Hash -eq $hash.Hash }
    if (!$match) {
        Write-Host "File $($hash.Path) exists only in $folder2."
    }
}
File C:\Test1\File1.txt exists in both folders and is identical.
File C:\Test1\File2.txt exists only in C:\Test1.
File C:\Test1\FolderA\File4.txt exists in both folders and is identical.
File C:\Test1\FolderB\File5.txt exists in both folders and is identical.
File C:\Test1\FolderB\File7.txt exists only in C:\Test1.
File C:\Test2\File3.txt exists only in C:\Test2.
File C:\Test2\FolderD\File6.txt exists only in C:\Test2.

MD5 (Message Digest 5) es una función hash criptográfica ampliamente utilizada que genera un valor hash de longitud fija 128 bits a partir de un mensaje de cualquier longitud. Aquí hay una explicación paso a paso del código, como se mencionó anteriormente:

  1. El primer paso es establecer las rutas a las dos carpetas que queremos comparar. Creamos dos variables, $folder1 y $folder2, y les asignamos las rutas a las dos carpetas.
  2. A continuación, utilizamos el cmdlet Get-ChildItem para recuperar todos los archivos en ambos directorios y canalizar la salida al cmdlet Get-FileHash, que genera el valor hash MD5 para cada archivo. Los valores hash resultantes se almacenan en las variables $hash1 y $hash2.
  3. Luego iteramos sobre cada valor hash en $hash1 y lo comparamos con $hash2. Usamos el cmdlet "Where-Object" para buscar un valor hash coincidente en $hash2 y, si se encuentra una coincidencia, enviamos un mensaje a la consola indicando que el archivo existe en ambas carpetas y es identico. Si no se encuentra una coincidencia, enviamos un mensaje indicando que el archivo existe solo en $folder1.
  4. Luego iteramos a través de cada valor hash en $hash2 y buscamos archivos que existan solo en $folder2. A continuación, utilizamos el cmdlet Where-Object para buscar un valor hash coincidente en $hash1 y, si no se encuentra ninguna coincidencia, enviamos un mensaje a la consola indicando que el archivo existe solo en $folder2.

Teniendo en cuenta las soluciones anteriores, comparar el contenido de dos carpetas en PowerShell puede ser una herramienta poderosa para identificar diferencias en el contenido y la estructura de los archivos. Agregar hash MD5 puede proporcionar una comparación más precisa de archivos. Con el script adecuado, esta tarea se puede realizar rápida y fácilmente, incluso en estructuras de directorios grandes y complejas.

Se trata de cómo comparar el contenido de dos carpetas en PowerShell.

Artículos relacionados