ユーザのPCにインストールされているJw_cadをサイレントでバージョンアップしなきゃいけないことがあったので、やったことをご報告です。
以前に作ったバージョンアップバッチファイルを使って、Jw_cadで使えるようにしてみました。
Jw_cadとは
Jw_cadは有名な無償で利用可能な二次元CADソフト、二次元CAD図面を独自ファイル(JWWファイル/JWCファイル)とかその他の図面形式のファイルに対応したCADソフトです。私はCADソフトは使わないので何に使うかピンとこないものですが、ユーザにとっては必要ソフトらしい。
インストーラを調べてみる
さっそく公式ページや窓の杜など安全なサイトからダウンロードしたインストール.exeを調べてみることにします。
ダウンロード実施現在のバージョンは8.24a、ファイル名は「jww824a.exe」でした。
さっそくインストーラにどんなオプションが利用可能かを「/?」付与で調べてみます。
/S : 初期化ダイアログを非表示。サイレントモード用:/S /v/qn
という記載と、
/V : パラメータをMsiExec.exeへ送る
という記載が見て取れました。ということは、「サイレントモード用:/S /v/qn」と記載がある箇所を使ってインストーラを起動すればサイレントインストールできるよ、ということのように思えます。※/vと/qnの間はスペースなどを入れません。どうやら/Vオプションで記載するオプションが(インストーラのsetup.exeに内包されるmsiファイルを実行する際の)msiexec.exeで指定するオプションを指定することのよう。
さっそくテスト環境でやってみたところ、すんなりとサイレントインストールに成功しました。
これなら、上手くできそう。
追記:(2022/04/22)
2022年4月4日にリリースしたバージョン8.25からインストーラーがInno Setupになりました。
※公式<http://www.jwcad.net/versioninfo.htm>に記載があり
このため、インストールオプションが変更になっています。
サイレントオプションは上述の「/S」「/S /v/qn」から
/VERYSILENT
に変更となります。
後述する、バッチファイル内のインストール行も
"%InstFileDir%\%InstFileName%" /S /v/qn
から、以下に変更。
"%InstFileDir%\%InstFileName%" /VERYSILENT
より詳細に指定すると、
"%InstFileDir%\%InstFileName%" /LANG=Japanese /VERYSILENT /SP- /NOCANCEL /NORESTART /SUPPRESSMSGBOXES
こちらでもいいかも。(ここまで、追記)
バージョンの確認方法
ベースとなるのは、以前に作成した
バッチファイルでアプリケーションのバージョンを比較して実行 - treedown’s Report
のCubePDFのバージョンアップをサイレント実行するバッチをひな形としました。
ただ、このときと相違点として、ファイルのバージョン判定部分をちょっと変更。
今回ファイル名にバージョン情報は記載されているものの、
jww824a.exe
のように、バージョンの数字の直後に「a」「b」といったアルファベット文字が(マイナーバージョンアップのときには)使われる傾向があるらしい、ということで、インストール済のバージョン情報を収集するのと同じように
「Get-ItemProperty '%InstFileDir%\%InstFileName%').VersionInfo.ProductVersion」
でインストールファイルのファイルバージョンを収集するようにバッチファイルを変更しました。(バージョン比較の処理で「a」「b」をちゃんと判定させる方法が思いつかなかった、ということです。)
バッチファイル
バッチファイルを掲載。画面上へのメッセージ表示はrem文として無効化しています。
--------------------------------------------------------------
ファイル名:jwwInst.bat
--------------------------------------------------------------
@echo off
set CurVer=
set InstFileDir=C:\Users\%USERNAME%\Downloads\Jw_cad
set InstFileName=
set InstFileNum=
set MgVerL=
set MiVerL=
set SubVerL=
set MgVer=
set MiVer=
set SubVer=
rem echo .
rem echo JW_CADのインストールとバージョンアップを実行します。
rem echo .
rem OSビット数判定※64ビット環境限定
if "%PROCESSOR_ARCHITECTURE%" EQU "AMD64" goto CHKFile
if "%PROCESSOR_ARCHITECTURE%" EQU "x86" goto end
rem echo ERR:32bitOSは未対応環境です。このまま終了します。
goto end
:CHKFile
rem ファイルの存在確認
if exist "C:\JWW\Jw_win.exe" goto CHKVer
rem ファイルが存在しない場合
rem echo デバッグ用msg:ファイルは存在しないので、処理は完了します。
goto end
:CHKVer
rem 一時ファイル生成しそこから変数に代入
Powershell -Command (Get-ItemProperty 'C:\JWW\Jw_win.exe').VersionInfo.ProductVersion>%CD%\Jw_winVerCHK.txt
set /P CurVer=<%CD%\Jw_winVerCHK.txt
rem set CurVer=%CurVer:~-8%
rem set CurVer=%CurVer: =%
del %CD%\Jw_winVerCHK.txt
rem echo 現在のバージョン=%CurVer%
rem インストール場所からファイル名を取得
pushd %InstFileDir%
FOR /F %%i in ('dir /b') DO @SET InstFileName=%%i
rem インストールファイルのバージョン情報からインストーラのバージョンを収集する
Powershell -Command (Get-ItemProperty '%InstFileDir%\%InstFileName%').VersionInfo.ProductVersion>%CD%\Jw_cadInstVer.txt
set /P InstFileNum=<%CD%\Jw_cadInstVer.txt
del %CD%\Jw_cadInstVer.txt
rem echo インストールファイルのバージョン=%InstFileNum%
popd
rem インストール済みバージョンとインストールファイルバージョンを比較する
rem インストール済のバージョン情報を取得
FOR /F "delims=. tokens=1,2,3" %%i in ("%CurVer%") DO (
set MgVerL=%%i
set MiVerL=%%j
set SubVerL=%%k
)
rem インストールファイルのバージョン情報を取得
FOR /F "delims=. tokens=1,2,3" %%a in ("%InstFileNum%") DO (
set MgVer=%%a
set MiVer=%%b
set SubVer=%%c
)
rem メジャーバージョンの比較
rem echo %MgVerL% EQU %MgVer%の比較
if %MgVerL% EQU %MgVer% (
rem echo インストールされたメジャーバージョンと同じ⇒次の判定へ
goto minorVerComp
) else (
if %MgVerL% GTR %MgVer% (
rem echo インストールされているメジャーバージョンが新しい⇒何もせず終了
goto end
) else (
if %MgVerL% LSS %MgVer% (
rem echo 旧バージョン⇒新バージョンをインストールします。
goto InstNewVer
)
)
)
:minorVerComp
rem マイナーバージョン(二番目の数値)の比較
rem echo %MiVerL% EQU %MiVer% の比較
if %MiVerL% EQU %MiVer% (
rem echo インストールマイナーバージョンと同じ⇒次の判定へ
goto RevNoComp
) else (
if %MiVerL% GTR %MiVer% (
rem echo インストールされているマイナーバージョンが新しい⇒何もせず終了
goto end
) else (
if %MiVerL% LSS %MiVer% (
rem echo 旧バージョン⇒新バージョンをインストールします。
goto InstNewVer
)
)
)
:RevNoComp
rem Revバージョン(三番目の数値)の比較
rem echo %SubVerL% EQU %SubVer% の比較
if %SubVerL% EQU %SubVer% (
rem echo インストールRevバージョンと同じ⇒全て同じなので何もせず終了
goto end
) else (
if %SubVerL% GTR %SubVer% (
rem echo インストールされているRevバージョンが新しい⇒何もせず終了
goto end
) else (
if %SubVerL% LSS %SubVer% (
rem echo 旧バージョン⇒新バージョンをインストールします。
goto InstNewVer
)
)
)
:InstNewVer
rem インストールファイルを実行
rem echo %InstFileDir%\%InstFileName% を実行します。
rem echo 新しいバージョン%InstFileName% をインストールしています。
rem "%InstFileDir%\%InstFileName%" /S /v/qn
"%InstFileDir%\%InstFileName%" /LANG=Japanese /VERYSILENT /SP- /NOCANCEL /NORESTART /SUPPRESSMSGBOXES
goto end
:end
set CurVer=
set InstFileDir=
set InstFileName=
set InstFileNum=
set MgrVer=
set MgrVerL=
set MgVerL=
set MiVerL=
set SubVerL=
set MgVer=
set MiVer=
set SubVer=
'--------------------------------------------------------------