ケーススタディ、こんな時どうする?
WinMergeを使ってファイルやフォルダーの比較(改良版)
As/Rでもちょっこっと載せてるのですが、画面分割した状態でタイムスタンプやサイズを比較するモードがあります。
残念ながら、タイムスタンプと、サイズしか比較しないので、タイムスタンプが信用できなかったり、サイズが一致する場合に見分けが付きません。
そらもー、どうしようもないくらいに当たり前なんですが、意外とバージョン管理とかやってるとあると困ることが多々あります。
例えば
if (x == 0)修正前
↓
if (x != 0)修正後
こんな風に修正したとしましょう。
ほら、ファイルサイズが変わらないのです。
しかもバージョン管理ソフトによって、サーバーなどから取得した時刻がタイムスタンプになっちゃうので、タイムスタンプ日付も当てになりません。
これを厳密に行う方法として、WinMergeというファイルのハッシュ値を用いて比較を行う、専用のツールと連携する方法を考えます。
WinMergeとは
WinMergeはテキスト系ファイルの差分比較と、マージの機能を持つフリーウェアです。
2~3つのファイルや、2つのフォルダーを比較ですることが可能であり、Windows系のファイル比較ソフトの代名詞といって良いでしょう。
機能拡張するとEXCELファイルなどのバイナリファイルの比較もできるようになります。
Ver.2系は今もメンテナンスされていますが、Ver.3系が2011年から開発ストップしているのがいささか不安です。
公式サイト
http://winmerge.org/
日本語版サイト
https://winmergejp.bitbucket.io/
スクリプトの作成
この手の外部コマンドの紹介も3回目なので、手抜きでいきなりスクリプトファイルを書いてしまいます。
スクリプト内に細かく解説を入れているので、あーこんなもんかとコピペして使っていただければと思います。
これを「ランチャーバー」や「お気に入りバー」とかに置くなり、IDを割り振ってツールバーやキー割り当てしたりしてください。
画面分割しているとフォルダー、表示しているフォルダーの比較になります。
画面分割していない状態だと、リストで選択しているアイテムの比較になります。
//現在、開いているパスをWinMergeを用いて比較するスクリプト
//画面分割している場合はそれぞれのパスの比較、画面分割していない場合はリストの選択数が1~3の場合はパラメータとして渡す
//
//※補足
//WinMeageのインストールパスを3箇所に書いているのは、D&Dでフォルダを渡された時のためにRunを使いたかったからです。
//(Runは変数展開できないが、ランチャーなどにスクリプトを置いた場合にD&Dでのファイル連携の対象になる)
//変数定義で分かりやすく書くなら、Shellコマンドに置き換えても良いでしょう
CheckGrammar=1
//アイコン画像を明示的に指定
icon=%ProgramFiles%\WinMerge\WinMergeU.exe
//作業用変数
var $SelectText$
//1画面モード
if ?State:DivisionWindow? == 0
//選択数が0なら現在のパスを渡す
if ?SelectedCount? <= 0
$SelectText$=?NowDir?
endif
//選択数3より大きいなら現在のパスだけ渡す、エラーにしてもいいかも
if ?SelectedCount? > 3
$SelectText$=?NowDir?
endif
//選択数が1~3なら値を渡す
if ?SelectedCount? >= 1
if ?SelectedCount? <= 3
for
//ファイルを記述する際に半角スペースを入れてくっつける
$SelectText$ =& ?SelFile?
next
endif
endif
//動作確認するために、コマンドラインテキストをクリップボードにコピーする場合はこのコメントを消す
//SetClipboardtext=$SelectText$
CommandLineOption = $SelectText$
SendInfoMode=0
ShiftSilentMode=0
BootDir=
BootMode=0
OpenMode=0
Run=%ProgramFiles%\WinMerge\WinMergeU.exe
exit
endif
//2画面モードの場合はパスを2個渡す
CommandlineOption="?TargetDir?" ?NowDir?
OpenMode=0
MultiCommandMode=0
ShiftSilentMode=0
BootDir=
BootMode=0
Run=%ProgramFiles%\WinMerge\WinMergeU.exe