2010年11月2日火曜日

.msiファイルの編集をVBScriptで自動化する

Windows Installerのファイル(.msi)はVisualStudioのセットアッププロジェクト(配置プロジェクト)などで生成することができますが、後でプロパティを細かく編集したい場合があります。生成された.msiファイルをORCAなどの.msiファイル編集エディタで開いて修正すればいいのですが、ビルドのたびに毎回同じ修正をするのも面倒だし、何回もやってると修正するのを忘れてしまったりします。

自動化したいと思っていろいろ調べたところ、VBScriptのデータベース操作(SQL)による編集が可能であることがわかりました。さらにそのスクリプトがビルド完了時に実行されるようにセットアッププロジェクトで設定しておくと、.msiが生成された後に自動で編集実行できます。

1.VBScriptのファイルを作成

テキストファイルで編集して拡張子を.vbsにすればOKですが、VisualStudioのエディタ画面でも編集できるので、セットアッププロジェクトに入れておいたほうがわかりやすいかと。Exclude プロパティをTrueにしておけばインストーラには含まれません。

2.VBScriptの中身を編集

.msiファイルのPropertyテーブルをSQLクエリで検索し、当該レコードのフィールドを編集するコードを書きます。ここらへんが詳しいので参考にしてください。コマンドライン引数として編集するファイル名が渡されるようにします。

3.単体テスト

VBScriptが正しく実行されるか、ビルドされた.msiファイルを使ってコマンドプロンプトでテストします。

cscript “~.vbs” “~.msi”

.vbs, .msiファイルがあるサブフォルダに移動してから実行するか、フルパスまたは相対パスで各ファイルのパスが通るようにして実行します。

4.セットアッププロジェクトでビルド後に自動実行されるように設定

プロジェクトのプロパティ RunPostBuildEvent を「ビルドが成功したとき」に設定しておき、PostBuildEvent プロパティに実行するVBScript のコマンドを設定します。

cscript “~.vbs” “~.msi”

単体テスト時のコマンドラインと同様です。絶対パスまたは、マクロを利用したプロジェクトからの相対パスを書きます。パスを含むファイル名はリテラルで囲みます(cscript.exe に対する引数になります)。

5.セットアッププロジェクトのビルドを実行する

うまく行けば.msiファイルのビルド後にVBScriptが実行され、編集も完了しているはずです。実際に編集できているかどうかは結局ORCAなどで確認するしか……。