はじめに
プログラムのインストールや設定用のバッチファイルがあって、それをユーザーに実行してもらいたい場合、通常zip圧縮して渡し、ユーザーに展開してもらって実行となりますが、インストーラがあれば便利です。
そこで、バッチファイルや関連するファイルを自己解凍書庫にして、解凍時に指定のプログラムを実行させる方法の説明です。ユーザーはインストーラをダブルクリックするだけでよくなります。
また、Windowsの「インストールされているアプリ」(Windows11)や「アプリと機能」(Windows10)からアンインストールできるようにします。
7-Zipの準備
今回作成するインストーラでは、圧縮ファイルを自己解凍し、指定されたファイルを実行します。
圧縮ファイルの作成にはフリーソフト 7-Zip を使います。
7-Zip では圧縮形式は .7z になります。一般的ではない形式ですが、自己解凍書庫にするので、ユーザーには形式がなんであるかは関係ありません。
なお、7-Zip は下記記事でも説明していますので、よければ見てください。
パスワード付zipファイルを暗号化形式AES-256で作成する – パソコン鳥のブログ
無圧縮ZIPファイルの作成 – パソコン鳥のブログ
展開したら文字化けしているzipファイルは7-Zipで展開する – パソコン鳥のブログ
次に、自己解凍書庫で指定ファイルを実行するための、ファイルを用意します。
LZMA SDK (Software Development Kit) を使用します。LZMA SDK は商用利用可能です。
LZMA SDK をダウンロード・展開して、binディレクトリ下の 7zSD.sfx を入手します。
アンインストール用バッチファイルの準備
インストールしたいプログラムやバッチファイルに加えて、ここでは、アンインストール用バッチファイルと、アンインストール情報をレジストリに登録するためのバッチファイルを用意します。
アンインストール情報はレジストリに登録しないと、作成したインストーラを実行した後に、「このプログラムは正しくインストールされなかった可能性があります」と表示されたダイアログ画面が出てしまいます。
アンインストール情報のレジストリへの登録では、HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 下に一意なキーを作成し、最低限2つの値 DisplayName と UninstallString を登録します。
DisplayName は、Windowsの「インストールされているアプリ」(Windows11)や「アプリと機能」(Windows10)で一覧に出てくる名称です。
UninstallString はアンインストールプログラムのパスを設定します。
サンプルとして、アプリ名「テスト」、アンインストールプログラム「c:\MyAPP\uninstall.bat」の情報をレジストリに設定するバッチファイルです。
また、レジストリに登録する一意なキー(ここではGUID)を、ファイル c:\MyAPP\guid.ini に保存しておきます。これはアンインストール時に必要になります。
このバッチファイルを set_uninstaller.bat とします。あとで、インストール時にこのバッチファイルが実行されるようにします。
:: GUID を生成
for /f "delims=" %%A in ('powershell -Command "[guid]::NewGuid().ToString()"') do set GUID=%%A
echo GUID=%GUID%> uninstall.ini
:: レジストリの設定
set KEY_PATH=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{%GUID%}
reg add "%KEY_PATH%" /f /reg:64
reg add "%KEY_PATH%" /v DisplayName /t REG_SZ /d "テスト" /f /reg:64
reg add "%KEY_PATH%" /v UninstallString /t REG_SZ /d "c:\MyAPP\uninstall.bat" /f /reg:64
:: GUIDは保存しておく
echo GUID=%GUID%> C:\MyAPP\guid.ini
アンインストールプログラムのサンプルバッチファイル uninstall.bat です。
インストール時に c:\MyAPP\uninstall.bat に置くようにします。
このバッチファイルは、guid.ini からインストール時に設定した GUID を取得し、 レジストリキーを削除します。
また、c:\MyAPP を削除します。
削除するディレクトリ下(c:\MyAPP)に uninstall.bat があるので、自分自身を含むディレクトリを消すバッチファイル – パソコン鳥のブログ の方法で自分自身を含むディレクトリを消すようにしています。
cd /d %~dp0
@if "%1"=="" (
for /f "delims==, tokens=1,2" %%a in (%~dp0guid.ini) do (if "GUID"=="%%a" SET GUID=%%b)
copy %0 %TEMP%\tmp.bat >NUL
start "" cmd /c "%TEMP%\tmp.bat 1"
exit
)
:: レジストリキーを削除
set KEY_PATH=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{%GUID%}
reg delete "%KEY_PATH%" /f /reg:64
rmdir /s /q C:\MyAPP% 2>NUL
なお、レジストリの設定には管理者権限が必要ですが、作成したインストーラの実行時やアンインストール時には、ユーザーアカウント制御(UAC)のダイアログが出るようになっているので、必要な権限は得られます。
インストール時に実行するプログラムの処理
インストール時に実行するプログラムを用意します。
このプログラムでは、通常のインストール処理に加えて、先の手順で作成した set_uninstaller.bat を実行してください。また、 uninstall.bat を c:\MyAPP にコピーしてください。
ここでは、サンプルとしてsetup.bat とします。
mkdir c:\MyAPP
:: アンインストール情報のレジストリへの登録
call set_uninstaller.bat
:: アンインストールプログラムを c:\MyAPP にコピー
copy uninstall.bat c:\MyAPP\
:: その他インストール作業を記述してください
自己解凍書庫の作成
必要なファイルが用意できたので、下記をまとめて、7-Zip で圧縮( 7z形式)してください。
ここでは、setup.7z とします。
・setup.bat
・set_uninstaller.bat
・uninstall.bat
・その他 setup.bat でインストールするファイル
次に config.txt を作成します。文字コードは UTF-8 です。
;!@Install@!UTF-8!
Title="セットアップ"
BeginPrompt="セットアップしますか?"
RunProgram="setup.bat"
;!@InstallEnd@!
Title、BeginPrompt は自己解凍書庫実行時に表示される下記ダイアログのタイトルとメッセージを指定します。
RunProgram で自動実行するプログラムを指定します。
続けて、「7-Zipの準備」の手順で入手した 7zSD.sfx を setup.7z 、config.txt と同じところに置きます。
コマンドプロンプトで次を実行します。
copy /b 7zSD.sfx + config.txt + setup.7z setup.exe
setup.exeが作成されます。
これが自己解凍書庫で、解凍後にsetup.batを自動実行するインストーラの完成です。
参考
7-ZipのSFX(自己解凍形式)ファイル作成忘備録|ぽぽろ
DSAS開発者の部屋:「このプログラムは正しくインストールされなかった可能性があります」を回避する方法 (Windows 7, Vista)
WOW64で起動した際に64bitレジストリへアクセスする – 気まま研究所ブログ
コメント