web-dev-qa-db-fra.com

Désinstallation silencieuse de programmes via CMD

Est-il possible de désinstaller des programmes sans interface graphique et de le faire via CMD?

30
kb67

Chaque programme qui s’installe correctement conformément aux directives de Microsoft crée une entrée de registre dans HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall. Habituellement, la clé du programme sera son GUID, ou encore le nom du programme. Dans cette clé se trouvera une entrée appelée UninstallString. Ceci contient la commande à exécuter pour désinstaller le programme.

Si vous savez déjà à l'avance ce que vous allez désinstaller, il devrait être assez facile de simplement l'insérer dans votre fichier de commandes. Cela devient cependant difficile lorsque vous essayez d'automatiser ce processus. Vous pouvez utiliser la commande reg pour extraire des données du registre, mais elle renvoie beaucoup de texte autour de la valeur réelle d'une clé donnée, ce qui rend son utilisation difficile. Vous voudrez peut-être expérimenter avec VBScript ou PowerShell, car ils ont de meilleures options pour obtenir des données du registre dans une variable.

19
nhinkle

Vous pouvez appeler le programme de désinstallation correct sans connaître le GUID, etc. à l'aide de WMIC.

Pour voir une liste des noms des programmes connus en interne par Windows:

wmic product get name

Recherchez le nom de votre produit. Il correspond probablement à celui indiqué dans le panneau de configuration "Programmes et fonctionnalités" , mais pas toujours.

Ensuite, vous pouvez utiliser

wmic product where name="_my_product_name" call uninstall

pour effectuer la désinstallation, AFAIK doit être silencieux (cela a été fait, mais essayez-le avant de miser sur la ferme. Le silence peut dépendre de la manière dont votre programme d'installation/de désinstallation a été construit).

Voir ici pour plus:

Il existe également une documentation de référence pour WMIC sur Microsoft.com.

26

Si PowerShell 3 (ou une version supérieure) est installé, vous pouvez émettre un appel WMI pour que tous les programmes soient nommés (ou "similaires" à une recherche, pour effectuer des recherches génériques), puis appeler la méthode Uninstall pour chacun d'eux. :

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

7
Ƭᴇcʜιᴇ007

Si un programme utilise Windows Installer, vous pouvez utiliser l'une des commandes suivantes:

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

Cependant, vous n'avez probablement ni le code produit ni le fichier MSI d'origine utilisé pour l'installation.

En dehors de cela, il n'y a pas de commande de désinstallation générique, car les installateurs qui n'utilisent pas Windows Installer sont "inconnus" du système d'exploitation. Ils peuvent fournir leur propre exécutable de désinstallation, mais le fait de savoir si cet exécutable inclut un moyen de l'exécuter sans interface graphique dépend du package logiciel individuel.

5
Stephen Jennings

Si vous savez où se trouve le fichier d'installation MSI, vous pouvez utiliser:

Msiexec/uninstall Application.msi/quiet

5
Steve

Un script VBScript vous aidera à désinstaller le programme requis.

Pour utiliser ce script, vous aurez besoin du nom du logiciel qui se trouve dans votre registre.

Entrez simplement le nom de l'application dans le script et exécutez-le avec les privilèges d'administrateur. il va désinstaller l'application. Mais cela ne fonctionnera que pour une application basée sur une fenêtre. pour une installation autonome ou des applications qui ne font pas d'entrée dans la chaîne de registre de désinstallation, le script ne fonctionnera pas.

Donc, dans ce cas, vous devrez trouver un autre moyen de désinstaller l'application.

Code:

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
Vino

Vérifiez ceci, il utilise un lot pour trouver la clé de registre du logiciel UninstallString, puis désinstaller le logiciel en mode silencieux, ce qui est bien plus fiable que celui de wmic que j'ai trouvé. 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
1
Marcus Zheng

La réponse correcte est ci-dessus, mais pour Windows X64, vous devez également vérifier:

HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\
0
sparks