[InstallShield] Uninstallコマンド

13586281_77ce82fa68_z
photo by Alan Levine

前バージョンのインストーラ作成にはInstallShieldが使われていたため古いInstallShieldを使ってインストーラーを作成した。

さて、サイレントインストールとサイレントアンインストールはどのようにすればいいのだろうか? インストーラーは古いタイプのInstallShieldによるsetup.exeである。だから、msiexec /Xは使えない。

インターネット上の情報を検索してみるとアンインストールコマンドを知るには HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\ 以下でアプリケーションソフトウェア名を持ったサブキーを検索するのが手っ取り早いことがわかった。
UninstallStringというサブキーがアンインストールのコマンド文字列の候補となる。古いsetup.exeではmsiexecではなくsetup.exeを使うので検索で複数ヒットした場合はmsiexecを使っていないものを選択する。 多くの場合は

"C:\Program Files (x86)\InstallShield Installation Information\{GUID}\setup.exe" -runfromtemp -l0x0409  -removeonly

となっているようだ。これだとインタラクティブモードで起動される。response file付きで起動すればサイレントにできるはずなのだが手元ではなぜか記録したresponse fileがエラーを起こしてサイレントにはできない。

また、上記のコマンド列をバッチファイルから実行するとrunfromtempオプションによりsetup.exeが一時的にコピーされて、そのコピーが実行状態になる。元のコマンドは子プロセスを切り離して終了するため、本体のsetup.exeの終了状態を知るすべがない。
アンインストール終了前に次のコマンドが実行されることになるので、確実にアンインストールできたかどうかもわからない。

新しいinstallshieldでは、 clone_waitというオプションが追加されているのでそれを使うことができるのだが、手元のものはsetup.exeの構造が古いため使えなかった。
その場合の解決としては、 runfromtempオプションを削るのが簡単。これを削るとコピーを作らないので終わるまで待つことができる。
コピーを作らないためアンインストールが自分自身をアンインストールしてしまってエラーになるかと思ったが正常終了していた。

注意点として、古いsetup.exeでインストールしたソフトウェアにmsiexec /Xを適用すると、途中まで動作してエラーになり、その後の状態がおかしくなる。
アンインストールは1628でエラーになり、アンインストールもインストールもできなくなった。

広告

コメントを残す

コメントを投稿するには、以下のいずれかでログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。