Desinstalación de programas de forma silenciosa a través de CMD
¿Hay alguna forma de desinstalar programas sin la interfaz gráfica y haciéndolo a través de CMD?
¿Hay alguna forma de desinstalar programas sin la interfaz gráfica y haciéndolo a través de CMD?
Puede invocar el desinstalador correcto sin conocer el GUID, etc. utilizando WMIC.
Para ver una lista de los nombres de los programas conocidos internamente por Windows:
wmic product get name
Busque el nombre de su producto. Probablemente coincida con el que aparece en el panel de control “Programas y características”, pero no siempre.
Luego puedes usar
wmic product where name="_my_product_name" call uninstall
para realizar la desinstalación, que AFAIK debería ser silenciosa (lo ha sido en mi experiencia, pero pruébalo antes de apostar por ello. El silencio puede depender de cómo fue construido su instalador/desinstalador).
Vea aquí para más información:
También hay documentación de referencia para WMIC en microsoft.com.
Cada programa que se instala correctamente según las directrices de Microsoft hace una entrada en el registro en HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall
. Normalmente, la clave del programa será su GUID, o bien el nombre del programa. Dentro de esa clave habrá una entrada llamada UninstallString
. Esta contiene el comando a ejecutar para desinstalar el programa.
Si ya sabe de antemano lo que va a desinstalar, debería ser bastante fácil ponerlo en su archivo por lotes. Sin embargo, la cosa se complica cuando intentas automatizar el proceso. Puedes usar el comando reg
para obtener datos del registro, pero devuelve mucho texto alrededor del valor real de una clave dada, lo que hace que sea difícil de usar. Es posible que desee experimentar con el uso de VBscript o PowerShell, ya que tienen mejores opciones para obtener datos del registro en una variable.
Si tiene instalado PowerShell 3 (o superior), puede realizar una llamada WMI para obtener todos los programas que se llamen de una manera determinada (o “como” una cosa determinada, para hacer búsquedas con comodines), y luego llamar al método Uninstall
para cada uno de ellos:
(Get-WmiObject -Query "SELECT * FROM Win32_Product WHERE Name like '%Partial Name%'").uninstall()
Si un programa utiliza Windows Installer, puede utilizar uno de los siguientes comandos:
msiexec /q /x <ProductCodeGuid>
msiexec /q /x <PathToMsi>
Sin embargo, es probable que no tenga ni el código del producto ni el archivo MSI original utilizado para la instalación.
Aparte de esto, no hay un comando de desinstalación genérico, ya que los instaladores que no hacen uso del Windows Installer son “desconocidos” por el sistema operativo. Pueden suministrar su propio ejecutable de desinstalación, pero el hecho de que ese ejecutable incluya una forma de ejecutarlo sin GUI depende de cada paquete de software.
Mira esto, se trata de usar un lote para encontrar la clave de registro UninstallString del software y luego desinstalar el software de forma silenciosa que es mucho más fiable en comparación con wmic Encontré 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
Un script VBScript le ayudará a desinstalar el programa requerido.
Para usar este script necesitarás el nombre del software que se encuentra en tu registro.
Simplemente introduce el nombre de la aplicación en el script y ejecútalo con privilegios de administrador; desinstalará la aplicación. Pero esto sólo funcionará para una aplicación basada en ventanas; para una instalación independiente o aplicaciones que no hacen una entrada en la cadena de desinstalación del registro, el script no funcionará.
Así que en ese caso tendrás que encontrar otra forma de desinstalar la aplicación.
Código:
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