2011年12月20日火曜日

◆アプリケーションをアンインストールする

win32_productでオブジェクトが取得できれば、Uninstallメソッドを呼ぶだけなので話は簡単だ。

アンインストールサンプル
  1. $p = gwmi win32_product -filter "name = 'SyntaxHighlighter'"
  2. $p.Uninstall()

しかし、インストーラの形式によってはwin32_productでは取得できないアプリケーションも存在する。

その場合は仕方が無いのでレジストリーから情報を取得することになる。
PowerShell: ◆インストールされているソフトウエアの一覧を取得(64ビットOS対応版)

このレジストリーを見てみると、「UninstallString」というのがあって、いかにもこれを実行するとアンインストール出来そうな雰囲気が漂っている。
image

レジストリーを使ったサンプル
  1. $appName = "SyntaxHighlighter"
  2. $path = "\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
  3. $wow = "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
  4. $patharray = ("HKLM:" + $path),("HKCU:" + $path)
  5. if(Test-Path $wow){$patharray += $wow}
  6.  
  7. $AppObj = Get-ChildItem -Path $patharray |
  8.    %{Get-ItemProperty $_.PsPath} |
  9.    ?{$_.DisplayName -eq $appName}
  10. if ($AppObj.UninstallString)
  11. {
  12.     Invoke-Expression $AppObj.UninstallString
  13. }else{
  14.     Write-Warning "($appName) is not exist"
  15. }

しかし、残念ながらこれは上手く動作してくれない。
「UninstallString」はそのままでは使えないらしい。
「MsiExec」のヘルプを見ながら試した所、こんな感じのようだ。

  1. MsiExec.exe /X'{00045CD3-323F-419D-A7BF-D3E8838E580D}'

なおかつ、常にMsiExecを使うというわけでもない(インストーラによる)ので、どのアプリケーションでもOKというスクリプトは断念した。(すべてのインストーラパターンを調べれば出来るのかもしれないが今のところ必要性を感じていないので)

0 件のコメント:

コメントを投稿