treedown’s Report

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

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

Terapadのバージョンアップを実行するバッチファイル

Terapadのバージョンアップを実行するために、インストール済のバージョンとインストールしようとしているバージョンを比較して、旧バージョンだったらインストールを実行するというバッチファイルを作成しましたのでご報告します。

前提条件

バッチファイルは共有フォルダの以下のフォルダに「tpad1209.exe」のようなインストール.exeファイルが保管されているという前提で動作します。

例:<\\FileSVR\Share\Terapad>

フォルダ内には、

このように「tpad1209.exe」のようなインストール.exeファイルのみが保管されるようにします。

バッチファイルはローカル実行を想定していますが、ネットワーク上の共有フォルダから実行しても動作することは確認しました。

バージョン取得元について

バージョンの取得元はそれぞれ下記のようになっています。

インストール済のバージョンを取得するのは、ローカルの<C:\Program Files (x86)\TeraPad\TeraPad.exe>(※32ビットOSの場合<C:\Program Files\TeraPad\TeraPad.exe>)インストール済のファイルからバージョンを取得しています。

PowerShellコマンドレットのGet-ItemPropertyを使ってVersionInfo.ProductVersionで取得できるファイルバージョンを使いました。

インストーラとなる「tpad1209.exe」のようなインストール.exeファイルのバージョンは、ファイルのプロパティから取得することが難しかったため、ファイル名「tpad1209.exe」の数字からバージョン情報として取得をしています。

バージョン比較の動作について

今回ちょっと行き詰まったのが、インストーラとインストール済のバージョン比較です。

記事時点の最新版は「Ver.1.2.9」となっています。参考:<https://tera-net.com/dl/tpad/History.txt>

それ以前のVer.1.27やVer.1.26といったバージョンの表記と、現在の最新バージョンの表記が変わっています。以後「Ver.1.2.9」のようなバージョン表記になるという前提で、バッチファイルを構成しました。

また、旧バージョン表記と最新バージョン表記の比較が(「1.27」と「1.2.9」の比較だと1.27の方が数が大きい判定になってしまう、という具合に)難しかったため、過去バージョン用の処理を一つ挿入して、現行の表記「1.2.9」の「9」に該当する三桁目のバージョン情報が変数に代入されなかったら、過去バージョンと判定してインストールを実行するように処理しました。

バッチファイル

それではバッチファイルです。

バッチファイル中のecho行は全てコメントアウトしています。処理のステップ確認に使うこともあると思ったので削除せずコメントアウトとしましたが、rem行を削ればもっと少ない行数になります。

--------------------------------------------------------------
tpadUpd.bat
--------------------------------------------------------------

@echo off
set TPADver=
set InstFileDir=\\FileSVR\Share\Terapad
set InstFileName=
set InstFileNum=

set MgVerL=
set MiVerL=
set SubVerL=
set MgVer=
set MiVer=
set SubVer=

rem echo .
rem echo Terapadのバージョンアップを実施します。
rem echo .

rem ファイルの存在確認
if exist "%PROGRAMFILES(x86)%\TeraPad\TeraPad.exe" goto update_start
if exist "%PROGRAMFILES%\TeraPad\TeraPad.exe" goto update_start
rem ファイルが存在しない場合はなにもせず完了
rem echo デバッグ用msg:ファイルは存在しないので、処理は完了します。
goto end

:update_start
rem OSビット数判定※64ビット環境限定
if "%PROCESSOR_ARCHITECTURE%" EQU "AMD64" goto CHKVer64
if "%PROCESSOR_ARCHITECTURE%" EQU "x86" goto CHKVer32
rem echo ERR:未対応環境です。このまま終了します。
goto end

:CHKVer32
rem 一時ファイル生成しそこから変数に代入
Powershell -Command  (Get-ItemProperty 'C:\Program Files\TeraPad\TeraPad.exe').VersionInfo.ProductVersion>%CD%\TPADverCHK.txt
set /P TPADver=<%CD%\TPADverCHK.txt
rem set TPADver=%TPADver:~-8%
rem set TPADver=%TPADver: =%
del %CD%\TPADverCHK.txt
rem echo 現在のバージョン=%TPADver%
goto getInstVer

:CHKVer64
rem 一時ファイル生成しそこから変数に代入
Powershell -Command  (Get-ItemProperty 'C:\Program Files (x86)\TeraPad\TeraPad.exe').VersionInfo.ProductVersion>%CD%\TPADverCHK.txt
set /P TPADver=<%CD%\TPADverCHK.txt
rem set TPADver=%TPADver:~-8%
rem set TPADver=%TPADver: =%
del %CD%\TPADverCHK.txt
rem echo 現在のバージョン=%TPADver%

:getInstVer
rem インストール場所からファイル名を取得
rem echo %InstFileDir%からファイル名を取得します。
rem echo %InstFileName%がインストールファイルです。
pushd %InstFileDir%

FOR /F %%i in ('dir /b') DO @SET InstFileName=%%i
rem 拡張子を除いてファイル名だけ取得
FOR /F %%i in ('echo %InstFileName%') DO set InstFileNum=%%~ni
rem バージョンだけ抜き出す[tpad1209.exeの「tpad」を取り払う。
rem 例:置き換える場合の書式[set InstFileNum=%InstFileNum:x64=x86%]
set InstFileNum=%InstFileNum:tpad=%
rem 後ろに文字列がある場合、以下で取り払う処理を有効にする(今回は対象外)
rem set InstFileNum=%InstFileNum:-Setup=%

rem ファイル名に「.」がないので比較処理用に補完する
set InstFileNum=%InstFileNum:~0,1%.%InstFileNum:~1,1%.%InstFileNum:~2,2%
rem インストーラファイルのバージョンを確認するため画面表示
rem echo %InstFileNum%がインストーラ対象バージョンです。
rem echo 対象インストーラファイルは%InstFileDir%\%InstFileName% を実行します。
popd

rem インストール済みバージョンとインストールファイルバージョンを比較する
rem インストール済のバージョン情報を取得
FOR /F "delims=. tokens=1,2,3" %%i in ("%TPADver%") 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 echo インストール済バージョンは%MgVerL%.%MiVerL%.%SubVerL%です。
rem 過去バージョン用の特殊処理
rem echo 三桁目%SubVerL%が存在しない場合、過去バージョンと判定してインストールを実行します。
if "%SubVerL%" EQU "" (
       echo 三桁目%SubVerL%が存在しないのでインストール処理を行います。
       goto InstNewVer
) else (
       echo 三桁目%SubVerL%が存在しています。比較処理を続行します。
)

rem メジャーバージョンの比較
rem echo %MgVerL% EQU %MgVer%の比較
       if %MgVerL% EQU %MgVer% (
              echo インストールされたメジャーバージョンと同じ⇒次の判定へ
              goto minorVerComp
       ) else (
              if %MgVerL% GTR %MgVer% (
                     echo インストールされているメジャーバージョンが新しい⇒何もせず終了
                     goto end
              ) else (
                     if %MgVerL% LSS %MgVer% (
                            echo 旧バージョン⇒新バージョンをインストールします。
                            goto InstNewVer
                     )
              )
       )

:minorVerComp
rem マイナーバージョン(二番目の数値)の比較
rem echo %MiVerL% EQU %MiVer% の比較
       if %MiVerL% EQU %MiVer% (
              echo インストールマイナーバージョンと同じ⇒次の判定へ
              goto RevNoComp
       ) else (
              if %MiVerL% GTR %MiVer% (
                     echo インストールされているマイナーバージョンが新しい⇒何もせず終了
                     goto end
              ) else (
                     if %MiVerL% LSS %MiVer% (
                            echo 旧バージョン⇒新バージョンをインストールします。
                            goto InstNewVer
                     )
              )
       )

:RevNoComp
rem Revバージョン(三番目の数値)の比較
rem echo %SubVerL% EQU %SubVer% の比較
       if %SubVerL% EQU %SubVer% (
              echo インストールRevバージョンと同じ⇒全て同じなので何もせず終了
              goto end
       ) else (
              if %SubVerL% GTR %SubVer% (
                     echo インストールされているRevバージョンが新しい⇒何もせず終了
                     goto end
              ) else (
                     if %SubVerL% LSS %SubVer% (
                            echo 旧バージョン⇒新バージョンをインストールします。
                            goto InstNewVer
                     )
              )
       )

:InstNewVer
rem インストールファイルを実行
rem echo %InstFileDir%\%InstFileName% を実行します。
rem echo 新しいバージョン%InstFileName% をインストールしています。
rem Terapadにサイレントインストールがないため、インストーラ実行のみ
rem "%InstFileDir%\%InstFileName%" /lang=japanese /VERYSILENT /NORESTART/ALLUSERS
"%InstFileDir%\%InstFileName%"
rem echo インストールファイルを実行しました。
goto end

:end
set TPADver=
set InstFileDir=
set InstFileName=
set InstFileNum=
set MgrVer=
set MgrVerL=

set MgVerL=
set MiVerL=
set SubVerL=
set MgVer=
set MiVer=
set SubVer=

--------------------------------------------------------------

過去バージョン用の処理部分(メモ)

過去バージョン用の特別な処理として

--------------------------------------------------------------

rem echo 三桁目%SubVerL%が存在しない場合、過去バージョンと判定してインストールを実行します。
if "%SubVerL%" EQU "" (
       echo 三桁目%SubVerL%が存在しないのでインストール処理を行います。
       goto InstNewVer
) else (
       echo 三桁目%SubVerL%が存在しています。比較処理を続行します。
)

--------------------------------------------------------------

ここがあります。
この「"%SubVerL%" EQU ""」の部分が比較処理で、変数%SubVerL%が空っぽ(="")の場合の処理を分岐させているIF文です。

echo行のコメントアウトを外して画面表示される状態で実行した場合の画面が下記です。

三桁目(変数=%SubVerL%)が存在しないので、インストーラが実行されました。

これが、インストール対象外だと、

このように、判定の結果、何もせず終了します。