如何在 PowerShell 中比较文件夹

本教程演示如何使用 PowerShell 比较两个文件夹。
PowerShell 比较文件夹
在 PowerShell 中比较两个文件夹是一个简单的逐步过程。我们可以使用 PowerShell 的 Compare-Object
方法来比较给定文件夹的内容。
请查看给定两个文件夹的逐步过程:
获取文件夹的内容
第一步是获取给定文件夹的内容。首先,运行以下命令以获取文件夹的子项:
$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.java
的 hash
。请查看输出:
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
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