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