PowerShell でフォルダーを比較する方法

PowerShell でフォルダーを比較する方法

このチュートリアルでは、PowerShell を使用して 2つのフォルダーを比較する方法を示します。

PowerShell フォルダー比較

PowerShell で 2つのフォルダーを比較することは簡単なステップバイステップのプロセスです。指定されたフォルダーの内容を比較するために、PowerShell の Compare-Object メソッドを使用できます。

指定された 2つのフォルダーのステップバイステップのプロセスを見てみましょう。

フォルダー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       =>

これは、これら 5つのファイルが名前でソースフォルダーと異なることを示しています。

フォルダーをファイルの内容で比較する

最後のステップでは、フォルダーのファイルの内容を比較します。この操作を行うには、まずフォルダー内のファイルを 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

上記のコマンドは、2つのフォルダーの内容をその 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
チュートリアルを楽しんでいますか? <a href="https://www.youtube.com/@delftstack/?sub_confirmation=1" style="color: #a94442; font-weight: bold; text-decoration: underline;">DelftStackをチャンネル登録</a> して、高品質な動画ガイドをさらに制作するためのサポートをお願いします。 Subscribe
著者: Sheeraz Gul
Sheeraz Gul avatar Sheeraz Gul avatar

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

関連記事 - PowerShell Folder