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対応版