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
FolderAyFolderB. Los elementos del directorio incluyenFile1.txtyFile2.txt.- C:\Test1\FolderA: contiene un archivo de texto (
File4.txt).
- C:\Test1\FolderA: contiene un archivo de texto (
- C:\Test1\FolderB: tiene un archivo de texto (
File5.txtyFile7.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).
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 -IncludeEqualProducció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-ChildItempara recuperar todos los elementos en el directorio especificado. - Utilice
Get-FileHashpara generar el valor hash MD5 para cada archivo. - Utilice dos bucles
foreachpara 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:
- El primer paso es establecer las rutas a las dos carpetas que queremos comparar. Creamos dos variables,
$folder1y$folder2, y les asignamos las rutas a las dos carpetas. - A continuación, utilizamos el cmdlet
Get-ChildItempara 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$hash1y$hash2. - Luego iteramos sobre cada valor hash en
$hash1y lo comparamos con$hash2. Usamos el cmdlet "Where-Object" para buscar un valor hash coincidente en$hash2y, 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. - Luego iteramos a través de cada valor hash en
$hash2y buscamos archivos que existan solo en$folder2. A continuación, utilizamos el cmdletWhere-Objectpara buscar un valor hash coincidente en$hash1y, 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.
