HOWTO · PowerShell
如何在 PowerShell 中比较文件夹
本教程演示如何使用 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