用登錄檔或PowerShell解除安裝程式
每個已安裝的程式都會在登錄檔中登記一條解除安裝指令。當「設定」→「應用程式」無法移除某個程式,或是需要靜默解除安裝時,就會用到這條指令。
Windows把解除安裝指令放在哪裡
為所有使用者安裝的程式位於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\Uninstall用PowerShell列出已安裝的程式
下面的指令會讀取這三個位置,顯示名稱、版本與解除安裝指令。
$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" /S或是交給winget
winget會在同樣的登錄機碼中尋找程式,包括不是它安裝的程式,並呼叫其解除安裝程式。
winget listwinget uninstall --name "軟體名稱"解除安裝程式不見了怎麼辦
如果解除安裝程式的檔案已被刪除,通常先重新安裝同一個版本就能修復,之後即可正常解除安裝。只有在程式檔案已經不存在時才手動刪除登錄機碼,刪除前請先匯出該機碼備份。
常見問題
為什麼程式沒有出現在「設定」→「應用程式」中?
「設定」只會列出有DisplayName、且沒有標記為系統元件的項目。免安裝版(可攜版)程式不會登記任何資訊,刪除它的資料夾就等於解除安裝。
MSI的ProductCode是什麼?
用來識別一個MSI套件的GUID。它就是該程式在…\Uninstall底下的子機碼名稱,ExeAtlas在每個MSI軟體的靜默安裝頁面上都有列出。