ファイルの差分を見たい時、WinMergeは便利なツールです。
マウス操作でも問題ありませんが、数十件、数百件という大量ファイルの差分チェックは、スクリプトにお任せしましょう。
やること
差分チェックをするファイルの対応表を読み込む
↓
読み込み結果を基にWinMergeをコマンドライン起動させ、ファイルの差分結果を表示
スクリプトの作成は、
Windowsマシンにデフォルトで入ってるPowerShellを使ってみます。
用意するもの
- WinMerge
- PowerShell実行環境
比較対象のファイル
target1フォルダ
ファイル名 | 内容 |
food.txt | apple banana orange |
hobby.txt | guitar soccer swimming |
location.txt | tokyo osaka kyoto |
target2フォルダ
ファイル名 | 内容 |
1.txt | リンゴ banana orange |
2.txt | guitar サッカー swimming |
3.txt | tokyo osaka 京都 |
手順
1.突合ファイルの対応表作成
・前提
- 突合ファイル群Aの命名規則:[半角英小文字].txt
例:food.txt、hobby.txt、location.txt - 突合ファイル群Bの命名規則:[数字].txt
例:1.txt、2.txt、3.txt - ファイル群Aとファイル群Bとは、必ず対応しているファイルがある。
対応表はカンマ区切り(タブでも良いと思います。お好みで)でtxtファイルに保存します。
・対応表
1 2 3 |
food,1 hobby,2 location,3 |
2.スクリプトを作成
下記のps1ファイルを作成して任意のディレクトリに保存します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# 対応表のファイルパス $fileName = "C:\temp\target.txt" # 対応表を読み込む $file = New-Object System.IO.StreamReader($fileName, [System.Text.Encoding]::GetEncoding("UTF-8")) # 回数記録用の値 $i = 1 # 対応表を1行ずつ読んでいく while (($line = $file.ReadLine()) -ne $null) { # カンマ区切りの文字列になっているため分割する $split = $line -split "," # チェックしたいファイルのファイルパス生成 $diff1 = 'C:\temp\target1\' + $split[0] + '.txt' $diff2 = 'C:\temp\target2\' + $split[1] + '.txt' # 差分比較 & 'C:\Program Files\WinMerge\WinMergeU.exe' $diff1 $diff2 # 5件分起動したら一時停止させる if($i % 5-eq 0){ Read-Host "続行するには何かキーを押してください。" } $i = $i + 1 } # ファイルを閉じる $file.Close() |
実装途中で気づいた事
・チェック件数について
一気に実行させるとチェック対象の件数分(100件なら100件分)、WinMergeが起動してしまいました。そのため、5件ごとに一時停止させる処理を追加しました。
・PowerShellでのexeファイルを実行方法について
ファイルへのフルパスを書けば実行できるかと思いましたが、それでは実行できませんでした。どうも、ファイルパスに空白文字がある場合は、&をつけた上でファイルパスを指定する必要があるみたいです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# フルパスのみ。実行できない PS C:\temp> C:\Program Files\WinMerge\WinMergeU.exe 用語 'C:\Program' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前 名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してか 。 発生場所 行:1 文字:11 + C:\Program <<<< Files\WinMerge\WinMergeU.exe + CategoryInfo : ObjectNotFound: (C:\Program:String) []、CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException # &付き。実行できる PS C:\temp> & 'C:\Program Files\WinMerge\WinMergeU.exe' PS C:\temp> |
3.プログラムを実行
PowerShellを起動し、上記で作ったプログラムを実行します。
件数分だけWinMergeが起動し、差分チェックの画面がでました。
5件より多い場合、このような感じで一時停止します。再開したい場合、キーを何か押下すればチェック処理が再開されます。
まとめ
如何でしたでしょうか?
PowerShellで行いましたが、Bash、PHP等々の他言語にもおきかえられる内容だと思います。他にも良い方法がありましたら教えていただけるとうれしいです!m(__)m
また、WinMergeのコマンドライン起動を使いこなせれば、ファイルの差分チェック作業をかなり効率化できそうだなと感じました。何十、何百ものファイルを手で開いて確認していくのは、心に闇を抱えてしまいますしね笑
それでは。