Disinstallare i programmi silenziosamente tramite CMD
C'è un modo per disinstallare i programmi senza l'interfaccia grafica e facendolo tramite CMD?
C'è un modo per disinstallare i programmi senza l'interfaccia grafica e facendolo tramite CMD?
Potete invocare il disinstallatore corretto senza conoscere il GUID, ecc. usando WMIC.
Per vedere un elenco dei nomi dei programmi come 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.
Poi puoi usare
wmic product where name="_my_product_name" call uninstall
per eseguire la disinstallazione, che AFAIK dovrebbe essere silenziosa (lo è stata nella mia esperienza, ma provala prima di scommetterci. Il silenzio potrebbe dipendere da come il vostro installatore/disinstallatore è stato costruito).
Vedi qui per saperne di più:
C'è anche documentazione di riferimento per WMIC su microsoft.com.
Ogni programma che si installa correttamente secondo le linee guida di Microsoft fa una voce di registro in HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall
. Di solito, la chiave del programma sarà il suo GUID, oppure il nome del programma. All'interno di quella chiave ci sarà una voce chiamata UninstallString
. Questa contiene il comando da eseguire per disinstallare il programma.
Se sai già in anticipo cosa disinstallerai, dovrebbe essere abbastanza facile metterlo nel tuo file batch. Diventa complicato quando si cerca di automatizzare il processo. Puoi usare il comando reg
per ottenere dati dal registro, ma restituisce un sacco di testo intorno al valore effettivo di una data chiave, rendendolo difficile da usare. Potresti voler sperimentare l'uso di VBscript o PowerShell, dato che hanno opzioni migliori per ottenere dati dal registro in una variabile.
Se avete installato PowerShell 3 (o superiore), potete fare una chiamata WMI per ottenere tutti i programmi che si chiamano come una certa cosa (o ‘come’ una certa cosa, per fare ricerche con caratteri jolly), e poi chiamare il metodo Uninstall
per ognuno di loro:
(Get-WmiObject -Query "SELECT * FROM Win32_Product WHERE Name like '%Partial Name%'").uninstall()
Se un programma usa Windows Installer, puoi usare uno dei seguenti comandi:
msiexec /q /x <ProductCodeGuid>
msiexec /q /x <PathToMsi>
Tuttavia, è probabile che tu non abbia né il codice del prodotto né il file MSI originale usato per l'installazione.
A parte questo, non esiste un comando generico di disinstallazione, poiché gli installatori che non fanno uso di Windows Installer sono “sconosciuti” dal sistema operativo. Potrebbero fornire il proprio eseguibile di disinstallazione, ma se quell'eseguibile include un modo per eseguirlo senza GUI dipende dal singolo pacchetto software.
Controlla questo, questo è usare un batch per trovare la chiave di registro UninstallString del software e poi disinstallare il software silenziosamente che è molto più affidabile rispetto a wmic 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
Uno script VBScript vi aiuterà a disinstallare il programma richiesto.
Per usare questo script avrete bisogno del nome del software che si trova nel vostro registro.
Inserite semplicemente il nome dell'applicazione nello script ed eseguitelo con i privilegi di amministratore; disinstallerà l'applicazione. Ma questo funzionerà solo per un'applicazione basata su finestra; per un'installazione standalone o per applicazioni che non fanno una voce nella stringa di disinstallazione del registro, lo script non funzionerà.
Quindi in questo caso dovrete 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