Desinstalar programas silenciosamente a través de CMD

Respuestas:

19

Cada programa que se instala correctamente de acuerdo con las pautas de Microsoft realiza una entrada en el registro HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall. Por lo general, la clave del programa será su GUID o, de lo contrario, el nombre del programa. Dentro de esa clave habrá una entrada llamada UninstallString. Este 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 simplemente poner eso en su archivo por lotes. Sin embargo, se vuelve complicado cuando intentas automatizar ese proceso. Puede usar el regcomando para obtener datos del registro, pero devuelve una gran cantidad de texto alrededor del valor real de una clave determinada, lo que dificulta su uso. Es posible que desee experimentar con VBscript o PowerShell, ya que tienen mejores opciones para obtener datos del registro en una variable.

nhinkle
fuente
26

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 figura en el panel de control "Programas y características" , pero no siempre.

Entonces puedes usar

wmic product where name="_my_product_name" call uninstall

para realizar la desinstalación, que AFAIK debe ser silencioso (según mi experiencia, pero pruébelo antes de apostar a la granja. El silencio puede depender de cómo se construyó su instalador / desinstalador).

Ver aquí para más:

También hay documentación de referencia para WMIC en microsoft.com.

Carnot Antonio Romero
fuente
2
Puede ejecutar este en equipos remotos mediante la adición de /node:"<ComputerName>"por ejemplo: wmic /node:"someuser-pc" product get name. Asegúrese de usar "" alrededor del nombre o se encontrará con el error "Interruptor global no válido". También asegúrese de ejecutar esto desde un indicador de CMD y no desde un indicador de PowerShell, ya que la "" solución para el error "Interruptor global no válido" no funciona en el indicador de PowerShell.
Chris Magnuson
1
Gran respuesta, pero una pequeña advertencia es que WMIC puede tardar bastante tiempo en ejecutar un comando. Listado de productos tomó alrededor de 3 minutos en mi PC.
SmacL
Debidamente notado, @SmacL. Solo he tenido la oportunidad de usar esto algunas veces, y dependiendo de lo que esté en su sistema, puedo creer que tomará un tiempo.
Carnot Antonio Romero
7

Si tiene instalado PowerShell 3 (o superior), puede emitir una llamada WMI para que todos los programas se denominen una cosa determinada (o 'me gusta', hacer búsquedas con comodines) y luego llamar al Uninstallmétodo para cada uno de ellos:

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

Ƭᴇcʜιᴇ007
fuente
5

Si sabe dónde está el archivo de instalación de MSI, puede usar:

Msiexec / uninstall Application.msi / quiet

Steve
fuente
5

Si un programa usa Windows Installer, puede usar uno de los siguientes comandos:

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

Sin embargo, es probable que no tenga el código del producto ni el archivo MSI original utilizado para la instalación.

Aparte de eso, no existe un comando de desinstalación genérico, ya que los instaladores que no utilizan Windows Installer son "desconocidos" por el sistema operativo. Pueden proporcionar su propio ejecutable de desinstalación, pero si ese ejecutable incluye una forma de ejecutarlo sin GUI depende del paquete de software individual.

Stephen Jennings
fuente
1

Un script VBScript lo ayudará a desinstalar el programa requerido.

Para usar este script, necesitará el nombre del software que se encuentra en su registro.

Simplemente ingrese el nombre de la aplicación en el script y ejecútelo con privilegios de administrador; desinstalará la aplicación. Pero esto solo funcionará para una aplicación basada en ventanas; para la configuración independiente o las aplicaciones que no ingresan en la cadena de desinstalación del registro, el script no funcionará.

Entonces, en ese caso, tendrá 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
Vino
fuente
1

Mira esto, está usando un lote, encuentra la clave de registro UninstallString del software y luego desinstala el software silenciosamente, lo que es mucho más confiable en comparación con wmic que 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
Marcus Zheng
fuente
0

La respuesta correcta está arriba, pero para las instalaciones de Windows X64 también deberá verificar:

HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\
moscas
fuente