Feb 08, 2008

NSISで制御構造

NSIS(Nullsoft Scriptable Install System)というものがあって、元々はWinampのインストーラを作るために使われてたらしいんだけど、これを使うとCとかVBとかDelphiとか分からなくても(簡単なものなら)Windows用のネイティブアプリケーションを作れる。まあ元々インストーラ作成用に作られたものだから、インストーラじゃないものを作るのは大変なんだけど。有名どころではPortable Firefoxの正体がNSISだったりする(大まかな処理の流れを紐解くと、USBメモリに置いたFirefoxの実行ファイル群とプロファイルをテンポラリフォルダにコピーして、起動オプション付きで起動することで強制的にそのプロファイルで起動し、Firefoxが終了したらプロファイルに行われた変更をUSBメモリに書き戻す、という感じ)。あとFirefoxのWindows版インストーラもNSIS製。

しかし厄介なことに制御構文がGoToっぽいものばっかりで、if/then/elseで複数行のブロックに分岐するといったことすらできないから、とかちょっと凝ったことをしようとすると、いつの時代のプログラムだよ!!と言いたくなるようなワケの分からん読みにくいスクリプトになってしまう。

Var MYVAR
StrCpy $MYVAR "ほげほげ"
; 第1引数が第2引数と等しければ第3引数で示された行へ、異なれば第4引数で示された行へ。
StrCmp "$MYVAR" "" "" NOT_BLANK
StrCpy $MYVAR "空ですよ"
GoTo EXIT
NOT_BLANK:
StrCpy $MYVAR "空じゃないですよ"
EXIT:

これはマジで死ねる。

……と思ってたんだけど、ヘルプをよくよく読むと、LogicLibという標準ライブラリを使えばもーちょっとマシな制御ができるようになるとあったので早速試してみた。

!include 'LogicLib.nsh'
...
StrCpy $MYVAR "ほげほげ"
${If} "$MYVAR" == ""
  StrCpy $MYVAR "空ですよ"
${Else}
  StrCpy $MYVAR "空じゃないですよ"
${EndIf}

うわ、これ超便利。NSISが一気に実用的になった!!! ちなみにswitch/caseとかwhile/for/do系のループとかもあります。

ということに感動して昨日はウッカリ深夜までNSIS漬けになってしまいました。

エントリを編集します。

wikieditish message: Ready to edit this entry.











拡張機能