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