treedown’s Report

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

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

dot-NET Frameworkバージョン判定しインストール

前回「.NET Framework4.8の有無をバッチファイルで判定する - treedown’s Report」に引き続き、Paint.netのサイレントインストール実施のバッチファイルを作っていきます。

Paint.netを4.2.16にアップデート準備

前回で.NET Framework4.8を判定できるようになったので、.NET Framework4.8ベースのPaint.netで比較的新しい(4.2系最後のリリース)バージョンとなる「paint.net.4.2.16.install.exe」を使ってサイレントインストールを進めて行こうと思います。

ちなみに、既存の(インストール済の)Paint.netのバージョンはレジストリキーの以下、
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{31D05AC5-4242-433C-A002-9DB22D740F8C}"
から確認しました。


さっそく前回<Paint.netの無人インストールを試してみる - treedown’s Report>の手順でMSIを作成していきます。
コマンドプロンプトで

 paint.net.4.2.16.install.exe /skipConfig /auto /createMsi CHECKFORUPDATES=0

と入力し、MSIを作成しました。

さっそく作成したMSIファイルを共有フォルダ<\\Server\ShareF\PaintDotNetMsi>に配置します。


ここまでで準備完了。

バッチファイルの概要

基本的な処理の流れは、以下のようになります。

  1. NET Framework 4.8のインストール判定⇒4.8がなければ何もせず終了
  2. 既存のファイル(%programfiles%\paintdotnet.exe)の存在確認⇒ファイルが見つからないと何もせず終了)
  3. インストール済のPaint.netのバージョンチェック、インストーラとバージョン比較(比較の結果、バージョンアップにならない場合は何もせず終了)
  4. OSのビット数判定(どちらのインストーラ.msiを使うか決定)
  5. msiexecコマンドでインストールを実行「/quiet /norestart」でサイレント
    ->終了

と簡単な流れ。

バッチファイル

まずはバッチファイルを。注意点は後述します。
--------------------------------------------------------------
Inst-paintdotnet.bat
--------------------------------------------------------------
@echo off
rem インストールファイルバージョン:paint.net.4.2.16.install.exeの場合、ファイルバージョンは「4.216.7781.39227」となる。
set InstFileVer=4.216
set PDNver=
set InstFileDir=\\Server\ShareF\PaintDotNetMsi

set MgVerL=
set MiVerL=
set MgVer=
set MiVer=

rem レジストリ確認
rem 今回は「.NET Framework」のバージョン確認

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" | find "Version" | find "4.8."
if %ERRORLEVEL% == 0 goto detectionDNF48
if %ERRORLEVEL% == 1 goto NoExistDNF48

:detectionDNF48
rem echo dot-NET-Framework4.8がインストールされています。
goto ChkPDNfile

:NoExistDNF48
rem echo dot-NET-Framework4.8はインストールされていません。
goto end

:ChkPDNfile
rem ファイルの存在確認
if exist "C:\Program Files\paint.net\paintdotnet.exe" goto ChkPDNver
if exist "C:\Program Files (x86)\paint.net\paintdotnet.exe" goto end
rem ファイルが存在しない場合
rem echo デバッグ用msg:ファイルは存在しないので、処理は完了します。
goto end

:ChkPDNver
rem インストール済みPaint.netバージョンの調査
Powershell -Command  (Get-ItemProperty 'C:\Program Files\paint.net\paintdotnet.exe').VersionInfo.ProductVersion>%CD%\PDMVerCHK.txt
set /P PDNver=<%CD%\PDMVerCHK.txt
del %CD%\PDMVerCHK.txt
rem echo 現在のバージョン=%PDNver%

rem インストール済のバージョン情報を取得
FOR /F "delims=. tokens=1,2" %%i in ("%PDNver%") DO (
    set MgVerL=%%i
    set MiVerL=%%j
    )
rem インストールファイルのバージョン情報を取得
FOR /F "delims=. tokens=1,2" %%a in ("%InstFileVer%") DO (
    set MgVer=%%a
    set MiVer=%%b
    )

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 インストールRevバージョンと同じ⇒全て同じなので何もせず終了
        goto end
    ) else (
        if %MiVerL% GTR %MiVer% (
            echo インストールされているマイナーバージョンが新しい⇒何もせず終了
            goto end
        ) else (
            if %MiVerL% LSS %MiVer% (
                echo 旧バージョン⇒新バージョンをインストールします。
                goto InstNewVer
            )
        )
    )


:InstNewVer
rem インストール処理の実行
rem echo 新しいバージョンの%InstFileDir%\PaintDotNet.msiを実行します。
rem OSビット数判定※64ビット環境限定
if "%PROCESSOR_ARCHITECTURE%" EQU "AMD64" goto Inst64
if "%PROCESSOR_ARCHITECTURE%" EQU "x86" goto Inst32
rem echo ERR:判定外のため未対応環境です。このまま終了します。
goto end

:Inst64
rem echo 実行するのは%InstFileDir%\PaintDotNet_x64.msiのサイレント実行です。
rem echo サイレントオプションを使用するためにUACをパスできるようにしてください。
rem pause
rem インストーラのオプション「/quiet」は「/qn」でも可
rem 
msiexec /i "%InstFileDir%\PaintDotNet_x64.msi" /quiet /norestart
rem 
goto end

:Inst32
rem echo ※注意:既存の環境調査が不十分です。インストールはお勧めしません。
rem echo インストールを実行しても問題ないことが分かっている場合のみ進めてください。
rem echo 実行するのは%InstFileDir%\PaintDotNet_x86.msiのサイレント実行です。
rem echo サイレントオプションを使用するためにUACをパスできるようにしてください。
rem pause
msiexec /i "%InstFileDir%\PaintDotNet_x86.msi" /quiet /norestart
goto end

:end
set InstFileVer=
set PDNver=
set InstFileDir=

set MgVerL=
set MiVerL=
set MgVer=
set MiVer=
--------------------------------------------------------------

途中のバージョン判定は以前のバッチファイルから流用しました。

注意点

32ビットOSで32ビットのPaint.netを使っていれば問題ないのですが、64ビットOSで32ビット版のPaint.net(x86と付くインストールファイル)を使っている場合、
「if exist "C:\Program Files (x86)\paint.net\paintdotnet.exe" goto end」
としているので、何もせず終了するようにしてしまいました。判定条件が増えてしまうのと、手持ちの環境にこの組み合わせがないことが主な理由です。(必要な場合ここをちょっと作り直す必要があります。)

メッセージ表示となるecho行は全てremでコメントアウトしましたが、デバッグや動作確認のために必要な場合にはechoのコメントアウトを解除する必要があります。

バージョンの判定は、インストール済のPaint.netの起動ファイル(.exe)を参照して、収集可能なファイルバージョンを利用することにしました。


そのため、Paint.net 4.2.16をインストールファイルバージョンの表記は「4.216」という感じで丸められることになります。判定条件となるインストールファイルのファイルバージョンも、インストール済のPaint.netの起動ファイル(.exe)のファイルバージョンもメジャーバージョン&マイナーバージョン(マイナーバージョン+リビジョンの数字)で比較することにしました。