HOWTO · PowerShell

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

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

このチュートリアルでは、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