ケーススタディ、こんな時どうする?

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