treedown’s Report

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

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

Skypeのアンインストールをバッチファイルで実行したい

Skypeアンインストールが必要という指示を受けて、アンインストールを自動化する目的でバッチファイルを作成しましたのでご報告です。
今回は実行時の管理者権限は外部ソリューションを使うので、純粋にアンインストールのみの処理をしています。

Skypeアンインストールをコマンドで

アンインストールのコマンドラインは以前の<アプリケーションをアンインストール後サイレントインストール - treedown’s Report>で調べたように確認していきます。

レジストリキー:
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Skype_is1

この箇所にある、UninstallString:(QuietUninstallStringは「 /SILENT」)

"C:\Program Files (x86)\Microsoft\Skype for Desktop\unins000.exe"
"C:\Program Files (x86)\Microsoft\Skype for Desktop\unins000.exe" /SILENT

で確認できました。これを実行することでアンインストールができそうです。

しかし、インストールされているアプリの一覧では、

Skypeは二種類ありました。ひとつはストアアプリ版のSkypeのようです。ストアアプリ版はPowerShellコマンドレットでアンインストールが可能です。

Get-AppxPackage Microsoft.SkypeApp | Remove-AppxPackage

これをバッチファイルで実行するために、以下のコマンドでコマンドプロンプトから実行しアンインストールを確認しました。

powershell -command "Get-AppxPackage Microsoft.SkypeApp | Remove-AppxPackage"

この二つのコマンドを判定含めてバッチファイルで実行すれば目的は達成出来そうです。

デスクトップ版は「unins000.exe」のファイル存在有無で、ストアアプリ版は「Get-AppxPackage Microsoft.SkypeApp」の実行結果を判定条件にして、インストールされていたらアンインストールのコマンドを実行するという感じでバッチファイルを構成してみました。

実際のバッチファイル

デスクトップ版とWindowsストアアプリ版の両方のSkypeアンインストールを自動化するバッチファイル。
ただしOSは64ビットOSのみで32ビットOSでは何もせずに終了します。
事情:32ビットOSでは途中のProgramFilesのパスが相違するのですが、対象の環境に32ビットOSがなかったため、64ビットOSのみ対象としました。

一瞬だけアンインストール画面が表示されてしまうが、回避不可能でした。
また、一部Echoコマンドがコメントアウトされていない箇所がありますので、お好みで「rem」を付加してコメントアウトする必要があります。

--------------------------------------------------------------
Skype-ui.bat
--------------------------------------------------------------
@echo off
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 uninst_start
if exist "%PROGRAMFILES(x86)%\Microsoft\Skype for Desktop\unins000.exe" goto uninst_start
rem ファイルが存在しない場合
rem echo デバッグ用msg:ファイルは存在しないので、処理は完了します。
goto wapp_skype

:uninst_start
rem echo ファイルは発見できました。
rem dir "%PROGRAMFILES%\Microsoft\Skype for Desktop\Skype.exe"
rem dir /b "%PROGRAMFILES(x86)%\Microsoft\Skype for Desktop\unins000.exe"
taskkill /IM "Skype.exe"
rem echo アンインストールファイルを実行
"%PROGRAMFILES(x86)%\Microsoft\Skype for Desktop\unins000.exe" /SILENT
rem echo アンインストールを完了します。
goto wapp_skype

:x86start
goto end

:wapp_skype
rem Windows App のSkypeアンインストールを実行します。
powershell -command "Get-AppxPackage Microsoft.SkypeApp" | findstr Name | findstr SkypeApp
if %ERRORLEVEL% == 0 goto ui_WAskype
if %ERRORLEVEL% == 1 goto NoApps

:ui_WAskype
echo Windows App版 Skypeのアンインストールを実行します。
rem powershell -command "Get-AppxPackage Microsoft.SkypeApp | Remove-AppxPackage"
powershell -command "Get-AppxPackage -AllUsers Microsoft.SkypeApp | Remove-AppxPackage"
goto end

:NoApps
echo Windows App版 Skypeが存在しないため、処理を終了します。
goto end

:end
--------------------------------------------------------------

処理の概要を解説

まず、「if "%PROCESSOR_ARCHITECTURE%"」行でOSのビット数を判定します。32ビットOSは前述のように、何もせず終了させるようにしました。

ラベル「x64start」の箇所でSkypeのアンインストーラである「unins000.exe」の存在確認をしています。このファイルの有無でSkypeがインストールされているかどうかも判断しています。存在していない場合には、ストアアプリ版が入っているかどうかの判定に移動します。

ラベル「uninst_start」は前述のデスクトップ版Skypeが、インストールされていた場合にアンインストールコマンドである「unins000.exe」を「/SILENT」オプション付きで実行します。完了後にストアアプリ版の判定に。

ラベル「wapp_skype」の箇所でストアアプリ版のSkypeインストール有無を判断しています。
コマンドレット「Get-AppxPackage」でSkypeが表示されるかどうかで判断しています。

ラベル「ui_WAskype」はストアアプリ版のSkypeがインストールされていればアンインストールを実行する箇所となります。
最初コマンドレットを"Get-AppxPackage Microsoft.SkypeApp | Remove-AppxPackage"としていたのですが、ユーザを問わずPCからSkypeを削除しなきゃいけないということになり、「-AllUsers」オプションを付与してPC内の全ユーザを対象としたアンインストール"Get-AppxPackage -AllUsers Microsoft.SkypeApp | Remove-AppxPackage"に修正しました。

テスト実行&気になった動作

テスト実行のためにはバッチファイルを管理者権限で実行する必要があります。

実行してみると、操作は不要で自動的にアンインストールの処理は完了したのですが、一切画面を表示せずにアンインストール、という具合にはいきませんでした。

バッチファイルを実行すると、Skypeアンインストールを処理している画面が一瞬だけ表示されます。

試しに別途サイレントオプション「/SILENT」を付けたアンインストールをコマンド単体で実行した(上図)のですが、どうもこの画面が一瞬表示されるのは抑制できない模様。

概ねサイレントでアンインストールが自動化できたということで、この一瞬だけ表示されるのは妥協することになりました。