web-dev-qa-db-de.com

Programme über CMD unbeaufsichtigt deinstallieren

Gibt es eine Möglichkeit, Programme ohne grafische Oberfläche und über CMD zu deinstallieren?

30
kb67

Jedes Programm, das sich ordnungsgemäß gemäß den Richtlinien von Microsoft installiert, erstellt einen Registrierungseintrag in HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall. Normalerweise ist der Schlüssel für das Programm die GUID oder der Name des Programms. Innerhalb dieses Schlüssels befindet sich ein Eintrag mit dem Namen UninstallString. Dieser enthält den auszuführenden Befehl zum Deinstallieren des Programms.

Wenn Sie bereits im Voraus wissen, was Sie deinstallieren werden, sollte es einfach genug sein, dies in Ihre Batch-Datei aufzunehmen. Es wird jedoch schwierig, diesen Prozess zu automatisieren. Sie können den Befehl reg verwenden, um Daten aus der Registrierung abzurufen. Er gibt jedoch viel Text um den tatsächlichen Wert eines bestimmten Schlüssels zurück, wodurch die Verwendung erschwert wird. Möglicherweise möchten Sie mit der Verwendung von VBscript oder PowerShell experimentieren, da diese über bessere Optionen zum Abrufen von Daten aus der Registrierung in eine Variable verfügen.

19
nhinkle

Mit WMIC können Sie das richtige Deinstallationsprogramm aufrufen, ohne die GUID usw. zu kennen.

So zeigen Sie eine Liste der Namen der Programme an, die Windows intern bekannt sind:

wmic product get name

Suchen Sie nach Ihrem Produktnamen. Es stimmt wahrscheinlich mit dem überein, der in der Systemsteuerung "Programs and Features" aufgeführt ist, aber nicht immer.

Dann können Sie verwenden

wmic product where name="_my_product_name" call uninstall

um die Deinstallation durchzuführen, sollte AFAIK schweigen (nach meiner Erfahrung, aber versuchen Sie es, bevor Sie die Farm darauf setzen. Schweigen kann davon abhängen, wie Ihr Installations-/Deinstallationsprogramm erstellt wurde).

Sehen Sie hier für mehr:

Es gibt auch Referenzdokumentation für WMIC auf Microsoft.com.

26

Wenn Sie PowerShell 3 (oder höher) installiert haben, können Sie einen WMI-Aufruf ausgeben, um alle Programme mit einem bestimmten Namen (oder "wie" einer bestimmten Sache, um Platzhaltersuchen durchzuführen) abzurufen, und dann die Uninstall-Methode für jede von ihnen aufrufen :

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

7

Wenn ein Programm Windows Installer verwendet, können Sie einen der folgenden Befehle verwenden:

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

Wahrscheinlich verfügen Sie jedoch weder über den Produktcode noch über die ursprüngliche MSI-Datei, die für die Installation verwendet wurde.

Ansonsten gibt es keinen allgemeinen Deinstallationsbefehl, da Installer, die Windows Installer nicht verwenden, dem Betriebssystem "unbekannt" sind. Sie stellen möglicherweise ihre eigene ausführbare Deinstallationsdatei bereit. Ob diese ausführbare Datei jedoch eine Möglichkeit zum Ausführen ohne GUI enthält, hängt vom jeweiligen Softwarepaket ab.

5

Wenn Sie wissen, wo sich die MSI-Installationsdatei befindet, können Sie Folgendes verwenden:

Msiexec/uninstall Application.msi/quiet

5
Steve

Ein VBScript-Skript hilft Ihnen bei der Deinstallation des erforderlichen Programms.

Zur Verwendung dieses Skripts benötigen Sie den Namen der Software, die sich in Ihrer Registrierung befindet.

Geben Sie einfach den Anwendungsnamen in das Skript ein und führen Sie ihn mit Administratorrechten aus. Es wird die Anwendung deinstallieren. Dies funktioniert jedoch nur für fensterbasierte Anwendungen. Für Standalone-Setups oder Apps, die keinen Eintrag in der Deinstallationszeichenfolge der Registrierung vornehmen, funktioniert das Skript nicht.

In diesem Fall müssen Sie einen anderen Weg finden, um die Anwendung zu deinstallieren.

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

Überprüfen Sie dies, verwenden Sie dazu einen Stapel, suchen Sie den UninstallString-Registrierungsschlüssel der Software und deinstallieren Sie die Software im Hintergrund, was viel zuverlässiger ist als das von mir gefundene wmic . 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

Die richtige Antwort ist oben, aber für Windows X64-Installationen müssen Sie auch Folgendes überprüfen:

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