Désinstallation silencieuse de programmes via CMD

Réponses:

19

Chaque programme qui s'installe correctement selon les 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 bien le nom du programme. Dans cette clé sera une entrée appelée UninstallString. Il 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 le mettre dans votre fichier de commandes. Cela devient difficile lorsque vous essayez d'automatiser ce processus. Vous pouvez utiliser la regcommande pour obtenir des données du registre, mais elle renvoie beaucoup de texte autour de la valeur réelle d'une clé donnée, ce qui la rend difficile à utiliser. 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.

ne pas penser
la source
26

Vous pouvez invoquer le programme de désinstallation correct sans connaître le GUID, etc. en utilisant WMIC.

Pour afficher la liste des noms des programmes connus en interne par Windows:

wmic product get name

Recherchez le nom de votre produit. Il correspond probablement à celui répertorié 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, qui AFAIK devrait être silencieux (cela a été dans mon expérience, mais essayez-le avant de parier la ferme sur cela. Le silence peut dépendre de la façon dont votre programme d'installation / désinstallation a été construit).

Voir ici pour plus:

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

Carnot Antonio Romero
la source
2
Vous pouvez le faire exécuter sur des ordinateurs distants en ajoutant /node:"<ComputerName>"ex: wmic /node:"someuser-pc" product get name. Assurez-vous que vous utilisez "" autour du nom ou vous rencontrerez l'erreur "Invalid Global Switch". Assurez-vous également que vous l'exécutez à partir d'une invite CMD et non d'une invite PowerShell car la solution de contournement pour l'erreur "Invalid Global Switch" ne fonctionne pas dans l'invite PowerShell.
Chris Magnuson
1
Excellente réponse, mais petite mise en garde, le WMIC peut prendre un certain temps pour exécuter une commande. La liste des produits a pris environ 3 minutes sur mon PC.
SmacL
Dûment noté, @SmacL. Je n'ai eu l'occasion de l'utiliser que quelques fois, et selon ce qui est sur votre système, je peux croire que cela prendrait un certain temps.
Carnot Antonio Romero
7

Si vous avez PowerShell 3 (ou supérieur) installé, vous pouvez émettre un appel WMI pour obtenir tous les programmes nommés une certaine chose (ou «aimer» une certaine chose, pour effectuer des recherches génériques), puis appeler la Uninstallméthode pour chacun d'eux:

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

Ƭᴇcʜιᴇ007
la source
5

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

Msiexec / désinstaller Application.msi / quiet

Steve
la source
5

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" par le système d'exploitation. Ils peuvent fournir leur propre exécutable de désinstallation, mais le fait que cet exécutable inclue un moyen de l'exécuter sans interface graphique dépend du progiciel individuel.

Stephen Jennings
la source
1

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 désinstallera l'application. Mais cela ne fonctionnera que pour une application basée sur une fenêtre; pour une configuration autonome ou des applications qui ne font pas d'entrée dans la chaîne de désinstallation du registre, le script ne fonctionnera pas.

Dans ce cas, vous devrez donc 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
Vino
la source
1

Vérifiez cela, cela utilise un lot, recherchez la clé de registre UninstallString du logiciel, puis désinstallez le logiciel en silence, ce qui est beaucoup plus fiable que 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
Marcus Zheng
la source
0

La bonne réponse est ci-dessus, mais pour les installations Windows X64, vous devrez également vérifier:

HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\
des étincelles
la source