如何在 PowerShell 中比较文件夹

如何在 PowerShell 中比较文件夹

本教程演示如何使用 PowerShell 比较两个文件夹。

PowerShell 比较文件夹

在 PowerShell 中比较两个文件夹是一个简单的逐步过程。我们可以使用 PowerShell 的 Compare-Object 方法来比较给定文件夹的内容。

请查看给定两个文件夹的逐步过程:

文件夹 1

文件夹 2

获取文件夹的内容

第一步是获取给定文件夹的内容。首先,运行以下命令以获取文件夹的子项:

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

上述命令将获取文件夹的内容。要显示内容,请调用已声明的变量:

$SourceFolder

源文件夹内容的输出是:

    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

目标文件夹内容的输出是:

    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

计算文件数量和给定文件夹的大小

这是一个可选步骤,我们统计每个文件夹中特定扩展名的文件数量,并计算每个文件夹的大小。运行以下命令。

统计每个文件夹中特定扩展名的文件数量:

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

上述命令将统计目标文件夹中扩展名为 .java 的文件数量。我们将为我们的文件夹获得的输出是 2。

同样,在源文件夹中:

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

上述命令将统计源文件夹中扩展名为 .java 的文件数量。我们将为我们的文件夹获得的输出是 2。

现在要计算给定文件夹的大小,请运行以下命令:

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

上述命令将计算每个给定文件夹的大小。我们文件夹的输出如下:

3061806
128054

按名称比较给定文件夹

我们将首先按其内容名称比较文件夹,这不会比较文件内部的内容。请查看命令:

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

上述命令将按名称比较文件夹的内容,并显示两个文件夹中不同的文件。请查看输出:

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

它显示这五个文件在名称上与源文件夹不同。

按文件内容比较给定文件夹

在最后一步,我们将按文件中的内容比较文件夹。要执行此操作,首先,我们需要将文件夹中的文件转换为 hash

hash 命令易于使用。例如:

Get-FileHash 'Delftstack.java'

上述命令将获取文件 Delftstack.javahash。请查看输出:

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

要获取文件夹中每个文件的 hash,我们需要运行 foreach 循环。请查看命令:

$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 }

上述命令将获取两个文件夹中每个文件的 hash。要显示它们,我们需要运行以下命令:

$DestinationFolder.Hash
$SourceFolder.Hash

目标文件夹的输出是:

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

源文件夹的输出是:

FACF7DD67442E2EF84460669E007DA40D17D82E4448D9DBC7E575D25D6012D30
3D543438B2036F4AFF2CBCD9527FDB00CB249CF6D4D01E3FC2E5DA1C693EC76C
DE35F58F1AF9A75902844BA13D5821EB99957B79555330EFF8C9F974C2481932
CCCDDAFD5EDB60F6CDB4E20CFE9FEBE74AB15D28AD0E465B56D23247F33B3315

现在我们可以按 hash 值比较两个文件夹的内容。请查看命令:

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

上述命令将按 hash 比较两个文件夹的内容,并输出不同内容的 hash。请查看输出:

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

由于我们无法看到哪个文件具有不同的内容,为了显示文件的名称,请运行以下命令:

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

上述命令将显示两个文件夹中包含不同内容的文件的完整路径。请查看输出:

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
Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe
作者: Sheeraz Gul
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

相关文章 - PowerShell Folder