treedown’s Report

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

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

VLCのバージョンアップをサイレントでやってみる。

VLCアップデートが必要になったので、上書きインストールをやってみるバッチファイルを作ってみましたのでご報告です。

今回の条件

VLCをワンクリックでバージョンアップしたい、ということでバッチファイルを作ることにしました。

f:id:treedown:20200710174148p:plain
今回、バッチファイルで実行させるにあたって、以下の条件で作成することになりました。

  • 既にインストール済のPCにだけ、新バージョンをインストール(アップデート)したい、逆にインストールされていないPCは何もしないようにしたい。
  • インストールに必要な権限は別途用意する(バッチファイル内では考慮しない、バッチファイル自体をインストール可能な権限で実行する)
  • サイレントインストール:ログインなどのトリガでユーザのPC画面には一切なにも表示せずインストールorアップデートを完了させたい
  • インストール先はデフォルトで良い、アップデートの際も既存のバージョンはデフォルトのインストール先にインストールされている
  • 共有フォルダ(例:\\FileServer\ShareF)にインストーラを置いて、各PCではバッチファイルを実行するだけにしたい。
  • インストーラは実行前にPCのローカルディスクにインストーラを保存してから実行したい。
  • インストールファイル(vlc-%バージョン%-win64.exe)はリネームしてよい。
  • 64ビットアーキテクチャのPCには必ず64ビットOSがインストールされている

そのまま条件が該当するケースは少ないかも。

インストールオプション「/S」

サイレントインストールは、インストール.exeファイルに、「/S」オプションを付けて実行するだけでサイレントインストールを実行してくれる模様。

記事時点の最新版のインストールファイルはvlc-3.0.11-win64.exe(vlc-3.0.11-win32.exe)となりますが、ファイル名を変更してもいいという条件があるので、扱いやすいファイル名(例えばvlcwin64.exe(vlcwin32.exe)など)にリネーム前提で考えるようにします。
となると、ファイル実行は「vlcwin64.exe /S」(32ビット版なら「vlcwin32.exe /S」に)という具合にバッチファイル内で実行すればサイレントインストールは可能ということになります。

インストール済の判定

ちょっと一工夫必要なのが、条件のうち
「既にインストール済のPCにだけ、新バージョンをインストール(アップデート)したい、逆にインストールされていないPCは何もしないようにしたい。」
という部分。
無差別に全体にインストールしたくないので、インストール済のPCにだけ新バージョンのインストーラを実行するとしたら、既にインストールされているかどうかを判定しないといけない、という。

判定は、「if exist ~」を実行して、uninstall.exeが発見できるかどうかでインストール済を判定します。
例文:
 if exist "%PROGRAMFILES%\VideoLAN\VLC\uninstall.exe"
 if exist "%PROGRAMFILES(x86)%\VideoLAN\VLC\uninstall.exe"
また、インストール先にx86が付与されているかどうかを確認して、32ビット版と64ビット版のどっちがインストールに使われているかを判定するようにします。

「if exist ~」の後には、条件を満たしたときに実行する命令文が続きます。(詳しくは後述のバッチファイル参照)

バッチファイル

ファイルサーバの\\FileServer\ShareF\VLCにファイルを保管して準備完了です。

f:id:treedown:20200710174208p:plain



一時的にサーバからインストールファイルを保管する場所が必要になります。そのフォルダが<C:\temp>となります。※ここにインストールするわけじゃなく、インストーラを一時的に保管する場所になります。

対象のPCは<C:\temp>がある前提でバッチファイルを作成しましたが、「InstDir=C:\temp」を欄を変えれば別のフォルダを指定することになります。

ここまで考えて作成したバッチファイルが以下です。

バッチファイル

@echo off
REM プログラム格納先:APRGDirへ記述
rem プログラム実ファイル:ALCLDirとPRGNameに記述
set InstDir=
set APRGDir=\\FileServer\ShareF\VLC
set PRGNamex64=vlcwin64.exe
set PRGNamex86=vlcwin32.exe
set AppFold=instVLC
set InstDir=C:\temp

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

:update_start
rem 既存ファイルで実行および更新版があれば更新する
rem echo デバッグ用msg:ファイルは、あります。
rem OSビット数判定
if "%PROCESSOR_ARCHITECTURE%" EQU "AMD64" goto inst64
if "%PROCESSOR_ARCHITECTURE%" EQU "x86" goto inst32
rem echo デバッグ用msg:未対応環境です
goto end

:inst64
SET COPYCMD=/Y
xcopy "%APRGDir%\%PRGNamex64%" "%InstDir%\%AppFold%\" /D /I > nul
SET COPYCMD=
"%InstDir%\%AppFold%\%PRGNamex64%" /S > nul
goto end

:inst32
SET COPYCMD=/Y
xcopy "%APRGDir%\%PRGNamex86%" "%InstDir%\%AppFold%\" /D /I > nul
SET COPYCMD=
"%InstDir%\%AppFold%\%PRGNamex86%" /S > nul
goto end

:end
set InstDir=
set APRGDir=
set PRGNamex64=
set PRGNamex86=
set AppFold=

--------------------------------------------------------------
ここまでがバッチファイル。

作成して思ったのですが、完了後に一時フォルダとインストールに使ったファイルは削除したほうがいいかなぁと思いました。