endokのブログ

IT・プログラミングネタ

PowerShellでフォルダ比較を行う

PowerShellの中でフォルダの中身を再帰的に比較したいことがあったため、調べた結果をメモ。

diffコマンドがあればこんな苦労はないのだが、PowerShellWindows標準のコマンドだとかゆいところに手が届かない感じ。
GUIならWinMergeがあるが、今回はPowerShellスクリプトから利用したい。

ググると、下記情報が出てくる。
stackoverflow.com

コードとしては下記の通り。

$d1 = get-childitem -path $dir1 -recurse
$d2 = get-childitem -path $dir2 -recurse
compare-object $d1 $d2

Get-ChildItemで比較する2フォルダを取得して、そのままCompare-Objectに渡している。
このやり方を試してみると特徴は、

  • ファイルの有無を比較できる
  • ファイルの内容の比較はできない
  • 同一ファイル名が別階層に存在していると差分なし扱いになってしまう

といったところ。
同一ファイル名の別階層を差分なし扱いにするため、今回は下記のように改変して使ってみた。

$d1 = (Get-Childitem -Path $dir1 -Recurse | % { $_.FullName.Replace(("$dir1" + "\"), "") })
$d2 = (Get-Childitem -Path $dir2 -Recurse | % { $_.FullName.Replace(("$dir2" + "\"), "") })

compare-object $d1 $d2

ファイルリストの比較はこれで問題なさそう。
本当はファイル内容の比較も行いたかったがそちらは簡単な書き方が結局見つけられず、普通にループしながらCompare-Objectをひたすら実行することに・・・。