常に右往左往

取り留めのない感じで色々と

ClickOnceアプリケーションを自動アンインストールする

というわけで前回ClickOnceアプリケーションを発行する - 常に右往左往 で作ったClickOnceアプリケーションを自動でアンインストールしてみる

自動でアンインストールってどうやるん?

そこから!!
んで調べたらこんな記事を発見!ありがたや~ srz-zumix.blogspot.jp

しかもソースまで記載されている!またまたありがたや~!
実行する前に対象の下記のレジストリ内に前回作ったアプリケーション"TestClickOnce"がおるか確認・・・
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall HKLM\SOFTWARE\Microsoft\Wow6432Node\Windows\CurrentVersion\Uninstall
え?いないんですけど!!!!
どういうこっちゃ?というわけで再度調べてみると

ClickOnceのインストール情報の場所は違うらしい

ということが分かった

ClickOnceをスクリプトでアンインストールしたい

ClickOnceはユーザ毎なので下記にあるらしい HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall ※通常のInstallerの場合は前項で確認した場所にある
確認してみるとあったよ
f:id:gabateru:20180407193625p:plain 続いてアンインストールコマンドを実行してみる
f:id:gabateru:20180407193722p:plain
すると下記の通り保守ダイアログが出た
f:id:gabateru:20180407193810p:plain

じゃあバッチを作ろう

というわけで作ったバッチはこちら

@echo off
SET REG_UNINSTALL_KEY=HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
    
for /f "tokens=1,2*" %%A in ('reg query "%REG_UNINSTALL_KEY%"') do (
    reg query "%%A" /v DisplayName 2>NUL | findstr /c:"TestClickOnce" 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"
                SET UNINSTALL_CMD="%%D"
            )
        )
    )
)

call "%UNINSTALL_CMD%"

pause

よっしゃ実行じゃ!
・・・あれ?ダイアログは上がってるっぽいけどすぐ消えるんすけど! ん~別の方法はないかのーと再び検索・・・するとこんな記事を発見

hogege.hatenablog.com VBScriptでやるか~。でも参考サイトのソースはアンインストールコマンド直打ちなので引数化をしよう
というわけで作ったVBScriptはこちら
[ClickOnce自動アンインストール.vbs]

On Error Resume Next

Set objShell = WScript.CreateObject("WScript.Shell")

intArgsCount = Wscript.Arguments.Count

'引数の数を取得し数が合わなければ処理を中止する。
If intArgsCount <> 2 Then
  WScript.Echo "引数が" & intArgsCount & "個渡されました。" & vbCrLf _
             & "指定可能な引数の数は 2 個なので処理を中止します。"
  
  '処理を中断
  WScript.Quit
End If

WScript.Echo "1 個目の引数の値:" & Wscript.Arguments(0)
WScript.Echo "2 個目の引数の値:" & Wscript.Arguments(1) 

''アンインストールするアプリを念のためKILL
objShell.Run "taskkill /f /im Wscript.Arguments(0)*"

'' レジストリから取得したUninstallStringを実行する
objShell.Run Wscript.Arguments(1)

''アンインストールのダイアログが表示されたら・・・
Do Until Success = True
    Success = objShell.AppActivate(Wscript.Arguments(0) & " の保守")
    Wscript.Sleep 200
Loop

''OKを押下しアンインストールを実行する。
objShell.SendKeys "OK"

そんでこいつを呼び出してあげるバッチはこんな感じ

@echo off

SET REG_UNINSTALL_KEY=HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

REM アンインストールコマンド取得処理    
for /f "tokens=1,2*" %%A in ('reg query "%REG_UNINSTALL_KEY%"') do (
    reg query "%%A" /v DisplayName 2>NUL | findstr /c:"TestClickOnce" 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"
                SET UNINSTALL_CMD="%%D"
            )
        )
    )
)

REM アンインストールコマンド実行VBScript呼び出し
cscript //nologo ClickOnce自動アンインストール.vbs "TestClickOnce" ""%UNINSTALL_CMD%""
pause

さて実行結果は?
無事アンインストールされました~!!
やったね!というわけで今回はここまで

【おまけ】最近ず~っと流している曲


ヤバイTシャツ屋さん - 「ヤバみ」Music Video