treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

JW_CADのサイレントなバージョンアップをやってみる

ユーザのPCにインストールされているJw_cadをサイレントでバージョンアップしなきゃいけないことがあったので、やったことをご報告です。
以前に作ったバージョンアップバッチファイルを使って、Jw_cadで使えるようにしてみました。

Jw_cadとは

Jw_cadは有名な無償で利用可能な二次元CADソフト、二次元CAD図面を独自ファイル(JWWファイル/JWCファイル)とかその他の図面形式のファイルに対応したCADソフトです。私はCADソフトは使わないので何に使うかピンとこないものですが、ユーザにとっては必要ソフトらしい。

インストーラを調べてみる

さっそく公式ページや窓の杜など安全なサイトからダウンロードしたインストール.exeを調べてみることにします。

f:id:treedown:20220213141644p:plain
ダウンロード実施現在のバージョンは8.24a、ファイル名は「jww824a.exe」でした。

f:id:treedown:20220213141706p:plain

さっそくインストーラにどんなオプションが利用可能かを「/?」付与で調べてみます。

/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=

'--------------------------------------------------------------