Disinstallazione silenziosa dei programmi tramite CMD


Risposte:


19

Ogni programma che si installa correttamente secondo le linee guida di Microsoft inserisce un registro HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall. Di solito, la chiave per il programma sarà il suo GUID, oppure il nome del programma. All'interno di quella chiave sarà presente una voce chiamata UninstallString. Questo contiene il comando da eseguire per disinstallare il programma.

Se sai già in anticipo cosa disinstallerai, dovrebbe essere abbastanza facile inserirlo nel tuo file batch. Tuttavia, diventa difficile quando si tenta di automatizzare tale processo. È possibile utilizzare il regcomando per ottenere dati dal registro, ma restituisce molto testo attorno al valore effettivo di una determinata chiave, rendendolo difficile da usare. Potresti voler sperimentare l'uso di VBscript o PowerShell, in quanto hanno opzioni migliori per ottenere dati dal registro in una variabile.


26

È possibile richiamare il programma di disinstallazione corretto senza conoscere il GUID, ecc. Utilizzando WMIC.

Per visualizzare un elenco dei nomi dei programmi conosciuti internamente da Windows:

wmic product get name

Cerca il nome del tuo prodotto. Probabilmente corrisponde a quello elencato nel pannello di controllo "Programmi e funzionalità" , ma non sempre.

Quindi puoi usare

wmic product where name="_my_product_name" call uninstall

per eseguire la disinstallazione, che AFAIK dovrebbe essere silenzioso (è stato nella mia esperienza, ma provalo prima di scommettere sulla farm. Il silenzio può dipendere da come è stato costruito il tuo installer / programma di disinstallazione).

Vedi qui per ulteriori informazioni:

C'è anche la documentazione di riferimento per WMIC su microsoft.com.


2
È possibile eseguire questo contro i computer remoti con l'aggiunta di /node:"<ComputerName>"es: wmic /node:"someuser-pc" product get name. Accertati di utilizzare "" attorno al nome o di incontrare l'errore "Switch globale non valido". Assicurarsi inoltre di eseguirlo da un prompt CMD e non da un prompt di PowerShell poiché la soluzione "" per l'errore "Switch globale non valido" non funziona nel prompt di PowerShell.
Chris Magnuson,

1
Ottima risposta, ma un piccolo avvertimento è che WMIC può richiedere un bel po 'di tempo per eseguire un comando. La quotazione dei prodotti ha richiesto circa 3 minuti sul mio PC.
SmacL

Annotato, @SmacL. Ho avuto occasione di usarlo solo poche volte e, a seconda di cosa c'è sul tuo sistema, posso credere che ci vorrebbe un po '.
Carnot Antonio Romero,

7

Se hai installato PowerShell 3 (o versione successiva), puoi emettere una chiamata WMI per ottenere tutti i programmi denominati una determinata cosa (o "come" una certa cosa, per eseguire ricerche con caratteri jolly), quindi chiamare il Uninstallmetodo per ciascuno di essi:

(Get-WmiObject -Query "SELECT * FROM Win32_Product WHERE Name like '%Partial Name%'").uninstall()


5

Se sai dove si trova il file di installazione MSI puoi utilizzare:

Msiexec / Uninstall Application.msi / quiet


5

Se un programma utilizza Windows Installer, è possibile utilizzare uno dei seguenti comandi:

msiexec /q /x <ProductCodeGuid>
msiexec /q /x <PathToMsi>

Tuttavia, probabilmente non hai né il codice prodotto né il file MSI originale utilizzato per l'installazione.

Oltre a ciò, non esiste un comando di disinstallazione generico, poiché i programmi di installazione che non utilizzano Windows Installer sono "sconosciuti" dal sistema operativo. Potrebbero fornire il proprio eseguibile di disinstallazione, ma se tale eseguibile includa un modo per eseguirlo senza GUI dipende dal singolo pacchetto software.


1

Uno script VBScript ti aiuterà a disinstallare il programma richiesto.

Per utilizzare questo script è necessario il nome del software che si trova nel registro.

Basta inserire il nome dell'applicazione nello script ed eseguirlo con i privilegi di amministratore; disinstallerà l'applicazione. Ma questo funzionerà solo per un'applicazione basata su finestra; per l'installazione autonoma o le app che non inseriscono una voce nella stringa di disinstallazione del registro, lo script non funzionerà.

Quindi in tal caso dovrai trovare un altro modo per disinstallare l'applicazione.

Codice:

On error resume Next

Dim strName, WshShell, oReg, keyname

Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."

'=============================================
'Change the value here with DisplayName's value
strName = " "
'=============================================
Set WshShell = CreateObject("WScript.Shell")
Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv")
strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
oReg.EnumKey HKEY_LOCAL_MACHINE, strKeyPath, arrSubKeys
For Each subkey In arrSubKeys
    keyname = ""
       keyname = wshshell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" & subkey & "\DisplayName")
    If keyname = strName then
        i = subkey
    End If
Next

If i Then

    WshShell.Run "MSIEXEC.EXE /X " & i & " /QN", 1, True
End If

Set WshShell = Nothing
set ObjReg = Nothing

WScript.Quit

1

Dai un'occhiata, questo sta usando un batch per trovare la chiave di registro UninstallString del software e quindi disinstallare il software in modo silenzioso che è molto più affidabile rispetto a wmic che ho trovato. https://community.spiceworks.com/topic/2143980-deploy-or-upgrade-java-8-via-shutdown-script-remove-old-javas

::It extracts software software GUID, then use the GUID to search the name and version
@echo off
setlocal ENABLEDELAYEDEXPANSION

set SoftwareName=Java 8
set NewVersion=8.0.1720.11
set x86GUID=HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
set x64GUID=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
set Installer=\\dc\sources\jre-8u172-windows-i586.exe REMOVEOUTOFDATEJRES=1 AUTO_UPDATE=0 EULA=0 NOSTARTMENU=1 SPONSORS=0 WEB_ANALYTICS=0 WEB_JAVA=1 WEB_JAVA_SECURITY_LEVEL=H /s
REM set Installer=d:\downloads\jre-8u172-windows-i586.exe REMOVEOUTOFDATEJRES=1 AUTO_UPDATE=0 EULA=0 NOSTARTMENU=1 SPONSORS=0 WEB_ANALYTICS=0 WEB_JAVA=1 WEB_JAVA_SECURITY_LEVEL=H /s

REM It's faster to first locate the software GUID, then search it's Name, Version & UninstallString
for /f "delims=" %%P in ('reg query "%x86GUID%" /s /f "%SoftwareName%" 2^>nul ^| findstr "HKEY_LOCAL_MACHINE"') do (
  echo %%P
  reg query "%%P" /v "DisplayVersion" 2>nul | findstr /r /c:"  %NewVersion%" >nul && (
    for /f "tokens=2*" %%A in ('reg query "%%P" /v "DisplayName" 2^>nul ^|findstr "DisplayName"') do echo %%B has already been installed
    for /f "tokens=2*" %%A in ('reg query "%%P" /v "DisplayVersion" 2^>nul ^|findstr "DisplayVersion"') do echo Version: %%B
    goto :EOF
  ) || (
    for /f "tokens=2*" %%A in ('reg query "%%P" /v "DisplayName" 2^>nul ^|findstr "DisplayName"') do echo Found other version %%B, upgrade in progress
    for /f "tokens=2*" %%A in ('reg query "%%P" /v "UninstallString" 2^>nul ^|findstr "UninstallString"') do (
      echo %%B | findstr /c:"MsiExec.exe"  >nul && (
        set MsiStr=%%B
        set MsiStr=!MsiStr:/I=/X!
        echo !MsiStr! /quiet /norestart
        !MsiStr! /quiet /norestart
        rem %Installer%
      ) || (
        echo None MsiExec Uninstall String %%B
        rem "%%B" /S
      )
    )
  )
)
if not defined MsiStr (
  echo %SoftwareName% not found, install it?
  rem %Installer%
)

endlocal

0

La risposta corretta è sopra, ma per le installazioni di Windows X64 dovrai anche controllare:

HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.