HOWTO · PowerShell

如何在 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