Carpetas de comparación de PowerShell

Sheeraz Gul 15 febrero 2024
Carpetas de comparación de PowerShell

Este tutorial demuestra cómo comparar dos carpetas usando PowerShell.

Carpetas de comparación de PowerShell

Comparar dos carpetas en PowerShell es un proceso sencillo paso a paso. Podemos usar el método Comparar-Objeto de PowerShell para comparar el contenido de las carpetas dadas.

Vea el proceso paso a paso para las dos carpetas dadas:

carpeta 1

carpeta 2

Obtener el contenido de las carpetas

El primer paso es obtener el contenido de la carpeta dada. Primero, ejecute los siguientes comandos para obtener los elementos secundarios de las carpetas:

$SourceFolder = Get-ChildItem -Path C:\Users\Sheeraz\DemoFolder1
$DestinationFolder = Get-ChildItem -Path C:\Users\Sheeraz\DemoFolder2

El comando anterior obtendrá el contenido de la carpeta. Y para mostrar el contenido, llame a la variable declarada:

$SourceFolder

La salida para el contenido de la carpeta de origen es:

    Directory: C:\Users\Sheeraz\DemoFolder1


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----          9/9/2022  12:38 PM            399 Delftstack.java
-a----         8/30/2022   2:45 PM             51 delftstack.rtf
-a----         11/1/2022  12:55 PM         127286 demo.bmp
-a----         7/27/2022   4:15 PM            318 Example1.java
$DestinationFolder

La salida para el contenido de la carpeta de destino es:

    Directory: C:\Users\Sheeraz\DemoFolder2


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         9/20/2022   5:16 PM             68 composer.json
-a----         9/20/2022   5:16 PM           4774 composer.lock
-a----         9/20/2022   4:11 PM        2801573 composer.phar
-a----         8/30/2022   2:45 PM             51 delftstack - Copy.rtf
-a----          9/9/2022  12:38 PM            399 Delftstack.java
-a----         8/30/2022   2:45 PM             51 delftstack.rtf
-a----         11/1/2022  12:55 PM         127286 demo - Copy.bmp
-a----         11/1/2022  12:55 PM         127286 demo.bmp
-a----         7/27/2022   4:15 PM            318 Example1.java

Calcule el número de archivos y la longitud de las carpetas dadas

Este es un paso opcional donde contamos la cantidad de archivos con extensiones particulares en cada carpeta y calculamos el tamaño de cada carpeta. Ejecute los siguientes comandos.

Cuente la cantidad de archivos con una extensión particular en cada carpeta:

($DestinationFolder | where {$_.Extension -eq '.java'}).count

El comando anterior contará la cantidad de archivos con la extensión .java en la carpeta de destino. La salida que obtendremos para nuestra carpeta es 2.

Del mismo modo, en la carpeta de origen:

($SourceFolder | where {$_.Extension -eq '.java'}).count

El comando anterior contará los archivos en la carpeta de origen con la extensión .java. La salida que obtendremos para nuestra carpeta es 2.

Ahora, para calcular el tamaño de la carpeta dada, ejecute los siguientes comandos:

($DestinationFolder | Measure-Object -Property length -sum).Sum
($SourceFolder | Measure-Object -Property length -sum).Sum

Los comandos anteriores calcularán el tamaño de cada carpeta dada. El resultado de nuestras carpetas es el siguiente:

3061806
128054

Comparar las carpetas dadas por nombre

Primero compararemos las carpetas por su nombre de contenido, que no compara el contenido dentro de los archivos. Ver el comando:

Compare-Object -ReferenceObject $SourceFolder.Name -DifferenceObject $DestinationFolder.Name

El comando anterior comparará el contenido de la carpeta por sus nombres y mostrará los diferentes archivos en ambas carpetas. Ver la salida:

InputObject           SideIndicator
-----------           -------------
composer.json         =>
composer.lock         =>
composer.phar         =>
delftstack - Copy.rtf =>
demo - Copy.bmp       =>

Muestra que estos cinco archivos son diferentes de la carpeta de origen por su nombre.

Comparar las carpetas dadas por contenido de archivos

En el paso final, compararemos la carpeta por el contenido de sus archivos. Para realizar esta operación, primero, necesitamos convertir los archivos en carpetas a hash.

El comando hash es fácil de usar. Por ejemplo:

Get-FileHash 'Delftstack.java'

El comando anterior obtendrá el hash para el archivo Delftstack.java.. Ver la salida:

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA256          FACF7DD67442E2EF84460669E007DA40D17D82E4448D9DBC7E575D25D6012D30       C:\Users\Sheeraz\Delftstack.java

Para obtener el hash de cada archivo en la carpeta, necesitamos ejecutar el ciclo foreach. Ver los comandos:

$SourceFolder = Get-ChildItem -Path C:\Users\Sheeraz\DemoFolder1 | foreach  {Get-FileHash -Path $_.FullName}
$DestinationFolder = Get-ChildItem -Path C:\Users\Sheeraz\DemoFolder2 | foreach  {Get-FileHash -Path $_.FullName}

Los comandos anteriores obtendrán el hash para cada archivo en ambas carpetas. Para mostrarlos, necesitamos ejecutar los siguientes comandos:

$DestinationFolder.Hash
$SourceFolder.Hash

La salida para la carpeta de destino es:

BBBFED20764B6B3FAE56DF485778F5F27918B63008B0EBCAF1342CA8ADC3EADF
23D197F445E3264BF230128A7AFB9BF0E65209249D51C4AD70F51F44DF2D83C5
8FE98A01050C92CC6812B8EAD3BD5B6E0BCDC575CE7A93B242BDE497A31D7732
3D543438B2036F4AFF2CBCD9527FDB00CB249CF6D4D01E3FC2E5DA1C693EC76C
FACF7DD67442E2EF84460669E007DA40D17D82E4448D9DBC7E575D25D6012D30
3D543438B2036F4AFF2CBCD9527FDB00CB249CF6D4D01E3FC2E5DA1C693EC76C
DE35F58F1AF9A75902844BA13D5821EB99957B79555330EFF8C9F974C2481932
DE35F58F1AF9A75902844BA13D5821EB99957B79555330EFF8C9F974C2481932
CCCDDAFD5EDB60F6CDB4E20CFE9FEBE74AB15D28AD0E465B56D23247F33B3315

La salida para la carpeta de origen es:

FACF7DD67442E2EF84460669E007DA40D17D82E4448D9DBC7E575D25D6012D30
3D543438B2036F4AFF2CBCD9527FDB00CB249CF6D4D01E3FC2E5DA1C693EC76C
DE35F58F1AF9A75902844BA13D5821EB99957B79555330EFF8C9F974C2481932
CCCDDAFD5EDB60F6CDB4E20CFE9FEBE74AB15D28AD0E465B56D23247F33B3315

Ahora podemos comparar el contenido de ambas carpetas por su valor hash. Ver el comando:

Compare-Object -ReferenceObject $SourceFolder.Hash  -DifferenceObject $DestinationFolder.Hash

El comando anterior comparará el contenido de dos carpetas por su hash y generará el hash para contenido diferente. Ver la salida:

InputObject                                                      SideIndicator
-----------                                                      -------------
BBBFED20764B6B3FAE56DF485778F5F27918B63008B0EBCAF1342CA8ADC3EADF =>
23D197F445E3264BF230128A7AFB9BF0E65209249D51C4AD70F51F44DF2D83C5 =>
8FE98A01050C92CC6812B8EAD3BD5B6E0BCDC575CE7A93B242BDE497A31D7732 =>
3D543438B2036F4AFF2CBCD9527FDB00CB249CF6D4D01E3FC2E5DA1C693EC76C =>
DE35F58F1AF9A75902844BA13D5821EB99957B79555330EFF8C9F974C2481932 =>

Como no podemos ver qué archivo tiene el contenido diferente, para mostrar el nombre de los archivos, ejecute el siguiente comando:

(Compare-Object -ReferenceObject $SourceFolder -DifferenceObject $DestinationFolder  -Property hash -PassThru).Path

El comando anterior mostrará la ruta completa a los archivos que contienen contenido diferente en ambas carpetas. Ver la salida:

C:\Users\Sheeraz\DemoFolder2\composer.json
C:\Users\Sheeraz\DemoFolder2\composer.lock
C:\Users\Sheeraz\DemoFolder2\composer.phar
C:\Users\Sheeraz\DemoFolder2\delftstack.rtf
C:\Users\Sheeraz\DemoFolder2\demo.bmp
Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook

Artículo relacionado - PowerShell Folder