Windowsのバッチファイルでインストール済みのアプリケーションをチェックし、されていない時のみインストーラを実行させたい時のサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
@echo off CALL :Install アプリケーション名1 CALL :Install アプリケーション名2 CALL :Install アプリケーション名3 EXIT /B 0 REM 指定されたアプリケーションをインストール :Install REM 指定されたアプリがインストールされているかチェック Call :IfInstalled %1 REM インストールされていない場合 IF %ERRORLEVEL% EQU 0 ( REM インストール実行 Call :RunInstaller %1 ) EXIT /B 0 REM END Install REM 指定されたアプリケーションがインストールされているかチェック REM ERRORLEVEL 1:インストール済み、0:未インストール :IfInstalled FOR /f "tokens=2,*" %%I in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s ^| find "DisplayName"') do ( IF %1==%%J EXIT /b 1 ) FOR /f "tokens=2,*" %%I in ('reg query "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s ^| find "DisplayName"') do ( IF %1==%%J EXIT /b 1 ) EXIT /b 0 REM END IfInstalled REM インストーラ―を実行 :RunInstaller REM %1に応じてサイレントインストーラなどを実行 EXIT /B 0 REM END RunInstaller |
解説
それではキモの部分のみ解説します。
処理の関数化(10行目)
実際は関数ではないですがラベルを用いてInstallという関数風にしてあります。IfInstalledやRunInstallerも同様です。
Callコマンドでラベルを指定するとそのラベルまで処理が飛びます。そしてEXITコマンドで呼び出し元に戻り、結果を返しています。/Bを付けないとバッチ処理自体が終わってしまうので注意が必要です。
指定した引数(例で言うとアプリケーション名1~3)は%1に入ってきます。
インストール有無のチェック方法(29~35行目)
以下のレジストリに該当のアプリケーション名があるかどうかで判断させています。PCにインストールされている場合と個人環境にインストールされている場合とで違うので両方確認しています。
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
- HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
DisplayNameというキーにアプリケーション名が入っているので、そこだけチェックする用にfindコマンドでフィルタをかけています。
インストールの実行(40~47行目)
引数%1でアプリケーション名が受け取れるので、それぞれのアプリケーションに応じたインストールコマンドを実行します。
設定をした後、本当にインストールができているのか、設定後にログに出すバッチを作ってます。特定アプリがインストールされたかうまくできなかったのですが、こちらは参考になりそうです。
インストールができていたら、「○○アプリはインストールできています」とログ出力したのですが、どの辺をさわったらいいでしょうか。
試してないけど16行目の0を1にして19行目をログ出力するように修正すれば出来るんじゃないかなと思います。