レジストリとPowerShellでアンインストールする方法
インストールされたプログラムは、それぞれアンインストールコマンドをレジストリに登録しています。[設定]→[アプリ]から削除できないときや、サイレントで削除したいときは、このコマンドを使います。
アンインストールコマンドの保存場所
全ユーザー向けのプログラムはHKLM、64ビット版Windows上の32ビットプログラムはWOW6432Node、自分だけにインストールしたプログラムはHKCUの下にあります。プログラムごとのサブキーに、DisplayName、DisplayVersion、UninstallString、そして多くの場合QuietUninstallStringが入っています。
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\UninstallHKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\UninstallHKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\UninstallPowerShellでインストール済みプログラムを一覧表示する
3か所すべてを読み取り、名前・バージョン・アンインストールコマンドを表示します。
$keys = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*", "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*", "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*"Get-ItemProperty $keys | Where-Object DisplayName | Select-Object DisplayName, DisplayVersion, UninstallString, QuietUninstallString | Sort-Object DisplayNameアンインストールコマンドを実行する
QuietUninstallStringがあれば、確認なしでプログラムを削除できます。なければUninstallStringを実行し、インストーラーの種類に応じたサイレント用オプション(NSISは/S、Inno Setupは/VERYSILENT)を付けます。MSIパッケージではサブキー名がProductCodeなので、msiexec /xで削除します。
msiexec /x {PRODUCT-CODE-GUID} /qn /norestart"C:\Program Files\App\uninstall.exe" /Swingetに任せる方法
wingetは同じレジストリキーからプログラムを見つけ、winget以外で入れたものも含めてアンインストーラーを実行します。
winget listwinget uninstall --name "アプリ名"アンインストーラーが見つからない場合
アンインストーラーのファイルが削除されている場合は、同じバージョンをいったん再インストールすると修復され、そのあと通常どおり削除できることがほとんどです。レジストリのエントリを手作業で消すのは、プログラムのファイルがすでに無い場合だけにし、削除前にキーをエクスポートしておきます。
よくある質問
[設定]→[アプリ]にプログラムが表示されないのはなぜですか?
[設定]に表示されるのは、DisplayNameがあり、システムコンポーネントとして指定されていないエントリだけです。ポータブル版のプログラムは何も登録しないため、フォルダーを削除すれば削除できます。
MSIのProductCodeとは何ですか?
1つのMSIパッケージを識別するGUIDです。…\Uninstall配下にあるそのプログラムのサブキー名がこれにあたり、ExeAtlasでは各MSIアプリのサイレントインストールのページに記載しています。