VLCアップデートが必要になったので、上書きインストールをやってみるバッチファイルを作ってみましたのでご報告です。
今回の条件
VLCをワンクリックでバージョンアップしたい、ということでバッチファイルを作ることにしました。
今回、バッチファイルで実行させるにあたって、以下の条件で作成することになりました。
- 既にインストール済の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にファイルを保管して準備完了です。
一時的にサーバからインストールファイルを保管する場所が必要になります。そのフォルダが<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=
--------------------------------------------------------------
ここまでがバッチファイル。
作成して思ったのですが、完了後に一時フォルダとインストールに使ったファイルは削除したほうがいいかなぁと思いました。