treedown’s Report

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

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

Skypeのバージョンアップをサイレントで実行するバッチファイル

Skypeのサイレントバージョンアップを実施する必要があったのでバッチファイルを作成しました。バッチファイルの内容をご報告です。

いくつか縛りのある形でのバッチになってしまいましたが、手元の環境の動作要件は満たしているので良しとしています。

条件・実施内容

Skypeデスクトップ版のバージョンアップはユーザ権限では自動アップデートされないため、別途権限を代行して新バージョンの展開を実施する必要がありました。(※インストーラの実行権限がない(Usersグループの)ユーザ権限でSkypeを利用している環境が対象です。)

そこでSkypeインストール.exeファイルをバッチファイルでサイレントオプション付きで実行したい、という目標を達成するために以下の条件でバッチファイルを用意しました。

  • インストーラは「SetupFul.exe」にリネームすること
  • ファイルのプロパティからバージョン情報が取得できること
  • 64ビットWindowsでローカルPCの"%PROGRAMFILES(x86)%\Microsoft\Skype for Desktop\Skype.exe"が存在すること

32ビットOSは対象の環境に存在しないため何もせずに終了しています。その他、条件に合わない場合にも何もせず終了するようにしました。

準備作業

対象とするSkypeデスクトップ版(Skype for Desktop)は公式からダウンロードします。

https://www.skype.com/ja/get-skype/

ダウンロードした直後のインストールファイルは以下のようにバージョン番号がファイル名に含まれています。

展開時にこれはリネームして、バッチファイル内で指定したファイル名(ここでは「SetupFul.exe」)にファイル名を変更しておきます。

これを後述のバッチファイルで指定する共有フォルダにコピーしておきます。

バッチファイル

サイレント実行するバッチファイルです。echoメッセージ表示行は全てコメントアウトしています。(実際に動作を確認する時にはecho行のコメントアウトを解除してメッセージ表示するようにもできます。

--------------------------------------------------------------
SkypeUpd.bat
--------------------------------------------------------------
@echo off
set SkpVer=
set InstFileDir=
set UpdSkpVer=
set MgVerL=
set MiVerL=
set MgVer=
set MiVer=
rem インストール元<InstFileDir>は環境によって変更する。
set InstFileDir=\\FILESVR\Share$\Skype
set InstFileName=SetupFul.exe


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

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

:update_start
rem echo ファイルは発見できました。
rem dir "%PROGRAMFILES%\Microsoft\Skype for Desktop\Skype.exe"
dir /b "%PROGRAMFILES(x86)%\Microsoft\Skype for Desktop\Skype.exe"

rem インストールSkypeファイルからバージョン確認
Powershell -Command  (Get-ItemProperty '%PROGRAMFILES(x86)%\Microsoft\Skype for Desktop\Skype.exe').VersionInfo.ProductVersion
Powershell -Command  (Get-ItemProperty '%PROGRAMFILES(x86)%\Microsoft\Skype for Desktop\Skype.exe').VersionInfo.ProductVersion>%CD%\SkpVerChk.txt
set /P SkpVer=<%CD%\SkpVerChk.txt
del %CD%\SkpVerChk.txt
rem echo 現在のバージョン=%SkpVer%

rem インストーラとバージョン比較
Powershell -Command  (Get-ItemProperty '%InstFileDir%\%InstFileName%').VersionInfo.ProductVersion
Powershell -Command  (Get-ItemProperty '%InstFileDir%\%InstFileName%').VersionInfo.ProductVersion>%CD%\UpdSkpVer.txt
set /P UpdSkpVer=<%CD%\UpdSkpVer.txt
del %CD%\UpdSkpVer.txt
rem echo インストール対象のバージョン=%UpdSkpVer%

rem バージョン比較
rem echo ローカル%SkpVer%とインストーラ%UpdSkpVer%の比較処理
rem インストール済のバージョン情報を取得
FOR /F "delims=. tokens=1,2" %%i in ("%SkpVer%") DO (
        set MgVerL=%%i
        set MiVerL=%%j
        )
rem インストールファイルのバージョン情報を取得
FOR /F "delims=. tokens=1,2" %%a in ("%UpdSkpVer%") DO (
        set MgVer=%%a
        set MiVer=%%b
        )
rem メジャーバージョン比較
        if %MgVerL% EQU %MgVer% (
                rem echo インストールされたメジャーバージョンと同じ⇒次の判定へ
                goto minorVerComp
        ) else (
                if %MgVerL% GTR %MgVer% (
                        rem echo インストールされているメジャーバージョンが新しい⇒何もせず終了
                        goto end
                ) else (
                        if %MgVerL% LSS %MgVer% (
                                rem echo 旧バージョン⇒新バージョンをインストールします。
                                goto InstSkype
                        )
                )
        )

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


:InstSkype
rem インストールファイルを実行
taskkill /IM "Skype.exe"
rem echo %InstFileDir%\%InstFileName% を実行します。
rem echo 新しいバージョン%UpdSkpVer%の%InstFileName% をインストールしています。
"%InstFileDir%\%InstFileName%" /verysilent /sp- /nocancel /norestart /suppressmsgboxes /nolaunch
rem echo "%InstFileDir%\%InstFileName%" /verysilent /sp- /nocancel /norestart /suppressmsgboxes /nolaunch
rem echo インストールを完了します。
goto end

:x86start
goto end

:end
set SkpVer=
set InstFileDir=
set UpdSkpVer=
set MgVerL=
set MiVerL=
set MgVer=
set MiVer=
set InstFileDir=
set InstFileName=
--------------------------------------------------------------

動作概要

変数「InstFileDir」にはSkypeインストーラの保存場所を指定します。「InstFileName」にはリネームしたファイル名を入力します。(前述の条件に記載のファイル名)

まずOSのビット数を判定して、Skypeのインストール場所の特定をするようにします。32ビットOSは対象外なので何もせず終了させています。(途中までやろうとした形跡が残っていますが気にしないようにします。)

既存のSkype実行ファイル<%PROGRAMFILES(x86)%\Microsoft\Skype for Desktop\Skype.exe>の存在有無を判断し、存在しなければSkypeがインストールされていないと判断し、何もせずに終了します。※今回はSkypeがインストールされているPCが対象(使っていないPCでは何もしたくない)で、新規インストールは対象にしていません。

ファイルを発見したら

(Get-ItemProperty '%PROGRAMFILES(x86)%\Microsoft\Skype for Desktop\Skype.exe').VersionInfo.ProductVersion

でファイルの詳細プロパティで確認出来るバージョン情報の数値を取得しています。

この位置(おそらく)にバージョン情報が表示されていないファイルでは正しくバージョン情報の取得と比較ができないかもしれません。
収集したバージョン情報は変数に代入しています。

ローカルのSkype.exeとインストーラ「%InstFileName%=SetupFul.exe」のプロパティにあるバージョン情報を比較しています。

  • 同じバージョンだった場合⇒何もせずに終了
  • ローカルのSkype.exeの方が新しいバージョンの場合⇒何もせずに終了
  • インストールするバージョンの方が新しいバージョンの場合⇒バージョンアップ処理へ

バージョン比較が二種類あるのは、誤動作があったため小数点で分割してx.xxxとあるそれぞれの数字を比較しています。

実際のインストール処理は、まず現在動作している"Skype.exe"プロセスをtaskkillコマンドで終了しています。
その後、サイレントインストールオプションを付けてSkypeのインストールを実行しています。

Skypeインストール後は自動で実行しないようにしていますので、手動でSkypeを起動し直す必要があります。

バッチファイルの動作確認

以下は、このバッチファイルを動作確認したときの画面表示です。前述のecho行コメントアウトを解除して、画面表示するようにしています。またインストーラが動作する行をコメントアウトして確認作業時に実際のインストール動作が動作しないようにして試しました。
※掲載しているバッチファイルはecho行をコメントアウトしているため、以下の動作確認バッチ画面を表示するには手動で編集が必要です。

インストールされていない環境の場合、

このように最初のファイルの存在確認で正常に判定されて終了しました。

古いバージョンがインストールされている場合、

このように、一通りバージョン判定が動作し、最終的により新しいバージョンがインストール対象として判定され、インストーラが実行されます。

同一バージョンがインストールされている場合、

バージョン比較でまったく同じバージョンという判定がされて、何もせずに終了するようになっています。

これをタスクスケジューラなどでインストールが動作する権限で実行させることによって、サイレントでSkypeのバージョンアップが動作するようになります。