Risposte:
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 reg
comando 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.
È 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.
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 Uninstall
metodo per ciascuno di essi:
(Get-WmiObject -Query "SELECT * FROM Win32_Product WHERE Name like '%Partial Name%'").uninstall()
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.
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
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
/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.