WinMerge で MS Office ファイルを比較するプラグイン（スクリプトレット移植版）

# プラグイン紹介

[WinMerge](https://winmergejp.bitbucket.io/) で Excel、Word、PowerPoint のファイルを比較するためのプラグインを作成しました。
WinMerge にも「CompareMSExcelFiles.sct」「CompareMSWordFiles.sct」「CompareMSPowerPointFiles.sct」が付属していますが、今回作成したものは、ファイルの読み取りに hishida 様の [xdoc2txt.exe](http://ebstudio.info/home/xdoc2txt.html) を使用しています。

S.Kohno 様の [xdocdiff WinMerge Plugin](http://freemind.s57.xrea.com/xdocdiffPlugin/)、来栖光明 様の [xdocdiffPlugin64](http://crus.mydns.jp/xdocdiffPlugin64/) を元に、スクリプトレットに移植してみました。
元は出力されるテキストが Shift_JIS だったのを、UTF-8 で出力されるように修正しています。

ライセンスは WinMerge と同じくGPL2です。

![diff.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513949/f586c6db-c6a1-8b88-91b7-1ef377c39c3b.png)

# 不具合に対処してみた経緯（2020/08/31）

問題の内容：

- ネットワーク上のExcelファイルを比較すると、「ファイルに書き込みできません」というエラーが出たり出なかったりする。
- 問題の位置でメッセージボックスを出すと、エラーが出なくなる。

対処：

- Excelの内容を吐き出す先のファイルとして、空のファイルを生成しておいてから先に進むようにした。


ファイルの書き込み・読み出しのタイミングによってエラーが起きるようなので、Sleep を入れられればよかったのですが、スクリプトレットで WScript オブジェクトが使用できず、Sleep する方法が不明でした。
今のところエラーメッセージなしで動作しているので、これで様子を見ようと思います。

# 使い方

1. [xdoc2txt.exe](http://ebstudio.info/home/xdoc2txt.html) は、WinMerge本体（WinMergeU.exe）と同じフォルダに配置してください。
2. 下記のソースを、xdocdiffU.sct の名前でローカルに保存します。
3. WinMerge をインストールしたフォルダの MergePlugins フォルダに xdocdiffU.sct を配置してください。
4. WinMerge のメニューから「プラグイン」－「プラグインの設定」を実行すると、xdocdiffU.sct が列挙されているはずです。
5. amb_xdocdiffplugin.dll（xdocdiffPlugin64 の本体）をすでにご利用の方は、amb_xdocdiffplugin.dllのチェックを外してください。
6. xdocdiffU.sct の設定オプションはありません。

![plugin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513949/5fc51775-6b01-e0ad-401f-cdf7bec7d398.png)


#ソース

```vb:xdocdiffU.sct
<scriptlet>
<implements type="Automation" id="dispatcher">
	<property name="PluginEvent">
		<get/>
	</property>
	<property name="PluginDescription">
		<get/>
	</property>
	<property name="PluginFileFilters">
		<get/>
	</property>
	<property name="PluginIsAutomatic">
		<get/>
	</property>
	<method name="UnpackFile"/>
	<method name="PackFile"/>
	<method name="ShowSettingsDialog"/>
</implements>

<script language="VBS">

'/////////////////////////////////////////////////////////////////////////////
'    This is a plugin for WinMerge.
'    Copyright (C) 2020 stonee
'
'    Original:
'      xdocdiff WinMerge Plugin http://freemind.s57.xrea.com/xdocdiffPlugin/
'      xdocdiffPlugin64 http://crus.mydns.jp/xdocdiffPlugin64/
'
'    This program is free software; you can redistribute it and/or modify
'    it under the terms of the GNU General Public License as published by
'    the Free Software Foundation; either version 2 of the License, or
'    (at your option) any later version.
'
'    This program is distributed in the hope that it will be useful,
'    but WITHOUT ANY WARRANTY; without even the implied warranty of
'    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
'    GNU General Public License for more details.
'
'    You should have received a copy of the GNU General Public License
'    along with this program; if not, write to the Free Software
'    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
'
Option Explicit

Dim fso: Set fso = CreateObject("Scripting.FileSystemObject")
Dim wsh: Set wsh = CreateObject("WScript.Shell")

Function get_PluginEvent()
	get_PluginEvent = "FILE_PACK_UNPACK"
End Function

Function get_PluginDescription()
	get_PluginDescription = "Display the text content of MS Word, Excel, PowerPoint and pdf files. (via xdoc2txt)"
End Function

Function get_PluginFileFilters()
	get_PluginFileFilters = "\.sxw;\.sxc;\.sxi;\.sxd;\.odt;\.ods;\.odp;\.odg;\.docx;\.docm;\.xlsx;\.xlsm;\.pptx;\.pptm;\.doc;\.xls;\.ppt;\.rtf;\.jaw;\.jtw;\.jbw;\.juw;\.jfw;\.jvw;\.jtd;\.jtt;\.oas;\.oa2;\.oa3;\.bun;\.wj2;\.wj3;\.wk3;\.wk4;\.123;\.wri;\.pdf;\.mht;\.eml$"
End Function

Function get_PluginIsAutomatic()
	get_PluginIsAutomatic = True
End Function

Function UnpackFile(fileSrc, fileDst, pbChanged, pSubcode)
	Dim objFile: Set objFile = fso.CreateTextFile(fileDst)
	objFile.WriteLine ""
	objFile.Close
	Set objFile = Nothing

	Dim cmd: cmd = "cmd /c xdoc2txt.exe -i -8 """ & fileSrc & """ > """ & fileDst & """"
	wsh.run cmd, 0, True

	pbChanged = True
	pSubcode = 0
	UnpackFile = True
End Function

Function PackFile(fileSrc, fileDst, pbChanged, pSubcode)
	PackFile = False
End Function

Function ShowSettingsDialog()
	MsgBox "No options."
End Function

</script>

</scriptlet>

```