Como Comparar Pastas no PowerShell

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:
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
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