*[PPx]スクリプトメモ WinMerge起動時文字コード指定

WinMergeでテキストファイルの比較をする際、文字コード
直指定することで文字化けせずに表示することが可能だが
http://d.hatena.ne.jp/nakapon/20170315


WinMergeには文字コードをチェックして自動表示する機能はなく
また起動時オプションで事前に文字コードを指定することもできない

自分が使用するのは今のところSJISUTF-8、UTF-16LE(BOMなし)だけ

しかもUTF-16LEは今のところResourceHackerの
リソースファイル(.rc)のみでしか使用しない

WinMergeが自動判定しないのなら自前で切換できないかと調査

WinMerge文字コードは例によってレジストリに保存されていた
場所はHKEY_CURRENT_USER\SOFTWARE\Thingamahoochie\WinMerge\Settingsの
CodepageDefaultCustomValue

なのでレジストリファイルをあらかじめ用意し、WinMerge
起動前に文字コードを拡張子から判定しレジストリ
取り込むことで対応することに


Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Thingamahoochie\WinMerge\Settings]
"CodepageDefaultCustomValue"=dword:000004b0

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\Thingamahoochie\WinMerge\Settings]
"CodepageDefaultCustomValue"=dword:0000fde9


//!*script
// WinMarge起動 Ver 3.0
// 使用エイリアス:なし
// ============================================================
// 変数宣言
var command		= '';		// PPxコマンドワーク
var WSHObj		= '';		// wshシェル
var mExt		= '';		// 現窓のマークファイル拡張子
var cWinMrg		= '"C:\\Program Files\\WinMerge\\WinMergeU.exe"';

//現窓のマークファイル拡張子取得
mExt = PPx.Extract('%T');

//現窓のマーク数チェック
switch (PPx.EntryMarkCount) {
	case 2:
		command = PPx.Extract('%#FDC');
		PPx.Execute('%K"@^END"'); // マークを外す
		break;
	case 1:
		command = PPx.Extract('%*extract(~"%%#/FDCM")');   //反対窓のマークファイルを取得(デリミタ/)
		if 	   ((command != '') 
			&& (command.indexOf('/') <= 0)) {	//デリミタがなければマーク1つと判定
			command = PPx.Extract('%FDCM')
			        + ' '
					+ command;
			PPx.Execute('%K"@^END"');  // マークを外す
			PPx.Execute('*execute ~,%%K"@^END"');	 // マークを外す(反対窓)
		} else {
			command = '';
		}
		break;
//	case 3:	//現在WinMargeUは3ディレクトリ比較に対応していない
	default:
		command = '';
    	break;
}

command = cWinMrg + ' ' + command;


WSHObj = new ActiveXObject('WScript.Shell');

//文字コードセット
if (mExt.toLowerCase() == 'rc') {
	mExt = PPx.Extract('reg import "C:\\Program Files\\WinMerge\\WinMerge 1200.reg"');
} else {
	mExt = PPx.Extract('reg import "C:\\Program Files\\WinMerge\\WinMerge 65001.reg"');
}
WSHObj.Run(mExt,0,true);

//プログラム起動
WSHObj.Run(command,1,false);  // false:終了待機しない

// 後処理
WSHObj = '';
PPx.Quit();