2015年4月14日火曜日

bat ファイルでアンインストールをする

Jenkins なんかでインストーラーの自動テストを組んでいると、
アンインストールをさせる必要も当然でてきます。

ただ、レジストリに登録されている名前が固定ならば良いのですが、
GUID の場合があるので汎用的に使えるようにバッチファイルを書きました。
(bat で結構いろいろできるんです)

レジストリを探す
インストーラーのアンインストール情報を探します。
情報は以下のノードに入ってます。
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
HKLM\SOFTWARE\Microsoft\Wow6432Node\Windows\CurrentVersion\Uninstall

regedit で上記ノードを見るとわかると思いますが、GUID やツール名などでキーがあります。
それを開くと DisplayName という名前の REG_SZ があります。ここに名前が格納されているので、これを鍵に情報を抜き出します。

まずは、DisplayName を参照しましょう。
レジストリの操作には reg コマンドを使用します。

if "%PROCESSOR_ARCHITECTURE%" == "x86" (
    SET REG_UNINSTALL_KEY=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
) else (
    SET REG_UNINSTALL_KEY=HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
)
for /f "tokens=1,2*" %%A in ('reg query "%REG_UNINSTALL_KEY%"') do (
    reg query "%%A" /v DisplayName 2>NUL
    if not errorlevel 1 (
        pause
    )
)

上記 bat を実行すると Uninstall キーにあるキーの DisplayName の値をダンプしていきます。

>reg_uninstall.bat

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\552277EA-F57E-7211-F7F4-B8BA1274B46C
DisplayName REG_SZ GNU Tools for ARM Embedded Processors 4.8 2014q2

続行するには何かキーを押してください . . .



HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\AmUStor
DisplayName REG_SZ Alcor Micro USB Card Reader

続行するには何かキーを押してください . . .

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Arduino
DisplayName REG_SZ Arduino

続行するには何かキーを押してください . . .

こちらは、「キー名[改行] DisplayName REG_SZ 名前」のように出力されるので、この名前のところに目的のソフト名が含まれているかを調べます。


先ほどの bat ファイルを以下のように修正します。(一部省略)
例として AutoIt を探してますが、実際に使う際はこちらを目的のソフト名にしてください。
for /f "tokens=1,2*" %%A in ('reg query "%REG_UNINSTALL_KEY%"') do (
    reg query "%%A" /v DisplayName 2>NUL | findstr /c:"AutoIt" 2>NUL
    if not errorlevel 1 (
        goto :EOF
    )
)

実行するとこんな感じ。
>reg_uninstall.bat
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\AutoItv3
DisplayName REG_SZ AutoIt v3.3.8.1

これで、アンインストール情報が含まれたレジストリを見つけることができました。

アンインストールコマンドを得る
情報の格納キーがどこかわかったので、次に具体的なアンインストール方法を取得します。
アンインストール方法は UninstallString にあります。

先ほどのバッチを以下のように変え、実行します。
for /f "tokens=1,2*" %%A in ('reg query "%REG_UNINSTALL_KEY%"') do (
    reg query "%%A" /v DisplayName 2>NUL | findstr /c:"AutoIt" 2>NUL >NUL
    if not errorlevel 1 (
        reg query "%%A" /v UninstallString
        goto :EOF
    )
)

>reg_uninstall.bat
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\AutoItv3
UninstallString REG_SZ C:\Program Files (x86)\AutoIt3\Uninstall.exe

このように、アンインストール情報が得られるのでいらない部分を削除して使います。

for /f "tokens=1,2*" %%A in ('reg query "%REG_UNINSTALL_KEY%"') do (
    reg query "%%A" /v DisplayName 2>NUL | findstr /c:"AutoIt" 2>NUL >NUL
    if not errorlevel 1 (
        for /f "tokens=1,2*" %%B in ('reg query "%%A" /v UninstallString') do (
            if not "x%%D" == "x" (
                @echo "%%D"
            )
        )
        goto :EOF
    )
)

reg query を入力に for ループをしています。改行ごとにループが回るので、このループは2回まわるのに注意してください。
上記、バッチを実行すると以下のようにアンインストールコマンドが取得できます。

>reg_uninstall.bat
"C:\Program Files (x86)\AutoIt3\Uninstall.exe"

後は、コマンドを実行するだけです。

サイレントアンインストール
さて、ここまでできたらサイレントモードでアンインストールしたいですよね。
サイレントアンインストールは UninstallString ではなく QuietUninstallString にコマンドが格納されています。
QuietUninstallString はインストーラーによって、存在したりしなかったりするの注意してください。

存在しない場合でも、サイレントモードに対応していればコマンドライン引数で指定することでできると思います。



0 件のコメント:

コメントを投稿