Antworten:
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 wird ein Eintrag aufgerufen 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 reg
Befehl verwenden, um Daten aus der Registrierung abzurufen. Er gibt jedoch eine Menge 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.
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 "Programme und Funktionen" aufgeführt wird , 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 (es ist meiner Erfahrung nach aber probieren Sie es aus, bevor Sie die Farm darauf setzen. Schweigen kann davon abhängen, wie Ihr Installer / Deinstaller erstellt wurde).
Sehen Sie hier für mehr:
Es gibt auch Referenzdokumentation für WMIC auf microsoft.com.
Wenn Sie PowerShell 3 (oder höher) installiert haben, können Sie einen WMI-Aufruf ausgeben, um alle Programme mit einem bestimmten Namen (oder "Gefällt mir", um Platzhaltersuchen durchzuführen) abzurufen, und dann die Uninstall
Methode für jedes dieser Programme aufrufen :
(Get-WmiObject -Query "SELECT * FROM Win32_Product WHERE Name like '%Partial Name%'").uninstall()
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 zur Verfügung. Ob diese ausführbare Datei jedoch eine Möglichkeit zum Ausführen ohne GUI enthält, hängt vom jeweiligen Softwarepaket ab.
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
Überprüfen Sie dies, dies verwendet einen Stapel, suchen Sie den UninstallString-Registrierungsschlüssel der Software und deinstallieren Sie die Software dann im Hintergrund, was im Vergleich zu wmic, das ich gefunden habe, viel zuverlässiger ist . 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
/node:"<ComputerName>"
ex: hinzufügenwmic /node:"someuser-pc" product get name
. Stellen Sie sicher, dass Sie "" um den Namen herum verwenden, da sonst der Fehler "Ungültiger globaler Switch" auftritt. Stellen Sie außerdem sicher, dass Sie dies von einer CMD-Eingabeaufforderung und nicht von einer PowerShell-Eingabeaufforderung aus ausführen, da die "" Problemumgehung für den Fehler "" Ungültiger globaler Switch "in der PowerShell-Eingabeaufforderung nicht funktioniert.