HOWTO · PowerShell

Como Comparar Pastas no PowerShell

Este tutorial demonstra como comparar duas pastas usando o PowerShell.

Nesta página

Este tutorial demonstra como comparar duas pastas usando o PowerShell.

Comparar Pastas no PowerShell

Comparar duas pastas no PowerShell é um processo fácil e passo a passo. Podemos usar o método Compare-Object do PowerShell para comparar o conteúdo das pastas dadas.

Veja o processo passo a passo para as duas pastas dadas:

Pasta 1

Pasta 2

Obter o Conteúdo das Pastas

O primeiro passo é obter o conteúdo da pasta dada. Primeiro, execute os seguintes comandos para obter os filhos das pastas:

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

O comando acima obterá o conteúdo da pasta. E para mostrar o conteúdo, chame a variável declarada:

$SourceFolder

A saída para o conteúdo da pasta de origem é:

    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

A saída para o conteúdo da pasta de destino é:

    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

Calcular o Número de Arquivos e o Tamanho das Pastas Dadas

Este é um passo opcional onde contamos o número de arquivos com extensões específicas em cada pasta e calculamos o tamanho de cada pasta. Execute os seguintes comandos.

Conte o número de arquivos com uma extensão particular em cada pasta:

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

O comando acima contará o número de arquivos com a extensão .java na pasta de destino. A saída que obteremos para nossa pasta é 2.

Da mesma forma, na pasta de origem:

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

O comando acima contará os arquivos na pasta de origem com a extensão .java. A saída que obteremos para nossa pasta é 2.

Agora, para calcular o tamanho da pasta dada, execute os seguintes comandos:

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

Os comandos acima calcularão o tamanho de cada pasta dada. A saída para nossas pastas é a seguinte:

3061806
128054

Comparar as Pastas Dadas pelo Nome

Primeiro, compararemos as pastas pelo nome do conteúdo, que não compara o conteúdo dentro dos arquivos. Veja o comando:

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

O comando acima comparará o conteúdo da pasta pelos nomes e mostrará os arquivos diferentes em ambas as pastas. Veja a saída:

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

Mostra que esses cinco arquivos são diferentes da pasta de origem pelo nome.

Comparar as Pastas Dadas pelo Conteúdo dos Arquivos

No passo final, compararemos a pasta pelo conteúdo de seus arquivos. Para realizar esta operação, primeiro, precisamos converter os arquivos nas pastas em hash.

O comando hash é fácil de usar. Por exemplo:

Get-FileHash 'Delftstack.java'

O comando acima obterá o hash para o arquivo Delftstack.java. Veja a saída:

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

Para obter o hash para cada arquivo na pasta, precisamos executar o loop foreach. Veja os 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 }

Os comandos acima obterão o hash para cada arquivo em ambas as pastas. Para mostrá-los, precisamos executar os seguintes comandos:

$DestinationFolder.Hash
$SourceFolder.Hash

A saída para a pasta de destino é:

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

A saída para a pasta de origem é:

FACF7DD67442E2EF84460669E007DA40D17D82E4448D9DBC7E575D25D6012D30
3D543438B2036F4AFF2CBCD9527FDB00CB249CF6D4D01E3FC2E5DA1C693EC76C
DE35F58F1AF9A75902844BA13D5821EB99957B79555330EFF8C9F974C2481932
CCCDDAFD5EDB60F6CDB4E20CFE9FEBE74AB15D28AD0E465B56D23247F33B3315

Agora podemos comparar o conteúdo de ambas as pastas pelo seu valor de hash. Veja o comando:

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

O comando acima comparará o conteúdo de duas pastas pelo seu hash e exibirá o hash para conteúdo diferente. Veja a saída:

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

Como não podemos ver qual arquivo tem o conteúdo diferente, para mostrar o nome dos arquivos, execute o seguinte comando:

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

O comando acima mostrará o caminho completo dos arquivos contendo conteúdo diferente em ambas as pastas. Veja a saída:

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