PowerShellでdiff(差分比較)を行う方法|Compare-Objectの使い方を解説

目次

スポンサードリンク

PowerShellでは、Linuxでおなじみの diff コマンドに相当する機能として Compare-Object コマンドを使用します。2つのファイルや配列の差異を比較して、どこが異なるのかを明示的に表示できます。

Compare-Objectコマンドの基本構文

Compare-Objectコマンドの基本的な構文は以下の通りです。-ReferenceObject、-DifferenceObject の記述は省略することもできます。

Compare-Object -ReferenceObject <左側> -DifferenceObject <右側>

検証用のファイルとして、textA.txtとtextB.txt を用意しました。

PS C:\test> cat .\textA.txt
AAA
BBB
CCC
DDD
EEE
PS C:\test> cat .\textB.txt
AAA
222
CCC
444
EEE

以下コマンドは textA.txt と textB.txt に差分があるか確認しています。結果として差分があるファイル名が表示されます。

PS C:\test> diff .\textA.txt .\textB.txt

InputObject SideIndicator
----------- -------------
.\textB.txt =>
.\textA.txt <=

ファイルの内容を比較する方法

ファイルの内容を比較したいときは、cat(Get-Content)コマンドと組み合わせて実行します。 以下のように、実際に差分がでている行の内容を表示できます。SideIndicator 列が <= になっているものは左側(testA.txt)にのみ存在する内容です。=> は右側(testB.txt)のみに存在する内容です。

PS C:\test> diff (cat .\textA.txt) (cat .\textB.txt)

InputObject SideIndicator
----------- -------------
222         =>
444         =>
BBB         <=
DDD         <=

両方のファイルで共通する行を表示する方法

共通する行を表示したいときは、-IncludeEqual オプションを指定します。SideIndicatorは == となり、両ファイルで共通する内容が表示されます。

PS C:\test> diff -IncludeEqual (cat .\textA.txt) (cat .\textB.txt)

InputObject SideIndicator
----------- -------------
AAA         ==
CCC         ==
EEE         ==
222         =>
444         =>
BBB         <=
DDD         <=

共通する行だけ表示する方法

-IncludeEqualオプションを指定した結果を、findstr コマンドでフィルタリングすることで、共通する行だけを抜き出して表示することができます。

PS C:\test> diff -IncludeEqual (cat .\textA.txt) (cat .\textB.txt) | findstr ==
AAA         ==
CCC         ==
EEE         ==

また、-IncludeEqual と -ExcludeDifferent を両方していすることで、共通する行だけ表示することもできます。

PS C:\test> diff -IncludeEqual -ExcludeDifferent (cat .\textA.txt) (cat .\textB.txt)

InputObject SideIndicator
----------- -------------
AAA         ==
CCC         ==
EEE         ==

まとめ

PowerShellではCompare-Objectを使うことで、ファイル・文字列・配列などあらゆる対象の差分を簡単に抽出できます。diffの代替としてぜひ活用してください。


PowerShellの基礎を一通り学べるおすすめ書籍
Windows環境で開発やシステム管理を行うエンジニアにとって、PowerShellの知識は非常に重要なスキルセットです。こちらの書籍はサンプルも豊富で手元に置いておきたい一冊です。

コマンドプロンプトのポケットリファレンス:Windows11対応版