Odpowiedzi:
Każdy program, który poprawnie instaluje się zgodnie z wytycznymi Microsoft, wprowadza do rejestru wpis HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall
. Zazwyczaj kluczem do programu będzie jego identyfikator GUID lub nazwa programu. Wewnątrz tego klucza będzie znajdować się wpis o nazwie UninstallString
. Zawiera polecenie do wykonania w celu odinstalowania programu.
Jeśli wiesz wcześniej, co chcesz odinstalować, wystarczy, że umieścisz to w pliku wsadowym. Jednak staje się to trudne, gdy próbujesz zautomatyzować ten proces. Możesz użyć reg
polecenia, aby uzyskać dane z rejestru, ale zwraca on dużo tekstu wokół rzeczywistej wartości danego klucza, co utrudnia jego użycie. Możesz poeksperymentować z użyciem VBscript lub PowerShell, ponieważ mają lepsze opcje przenoszenia danych z rejestru do zmiennej.
Możesz wywołać prawidłowy deinstalator bez znajomości GUID itp. Za pomocą WMIC.
Aby zobaczyć listę nazw programów znanych wewnętrznie przez Windows:
wmic product get name
Poszukaj nazwy swojego produktu. Prawdopodobnie pasuje do tego z panelu sterowania „Programy i funkcje” , ale nie zawsze.
Następnie możesz użyć
wmic product where name="_my_product_name" call uninstall
aby wykonać deinstalację, o której AFAIK powinien milczeć (było to z mojego doświadczenia, ale wypróbuj ją, zanim postawisz na farmę. Cisza może zależeć od tego, w jaki sposób został zbudowany instalator / deinstalator).
Zobacz tutaj po więcej:
Istnieje również dokumentacja referencyjna dla WMIC na microsoft.com.
Jeśli masz zainstalowany program PowerShell 3 (lub nowszy), możesz wywołać wywołanie WMI, aby nadać nazwom wszystkie programy określoną nazwę (lub „polubić” określoną rzecz, aby wyszukiwać z użyciem symboli wieloznacznych), a następnie wywołać Uninstall
metodę dla każdego z nich:
(Get-WmiObject -Query "SELECT * FROM Win32_Product WHERE Name like '%Partial Name%'").uninstall()
Jeśli program korzysta z Instalatora Windows, możesz użyć jednego z następujących poleceń:
msiexec /q /x <ProductCodeGuid>
msiexec /q /x <PathToMsi>
Jednak prawdopodobnie nie masz ani kodu produktu, ani oryginalnego pliku MSI użytego do instalacji.
Poza tym nie ma ogólnego polecenia odinstalowania, ponieważ instalatory, które nie korzystają z Instalatora Windows, są „nieznane” przez system operacyjny. Mogą dostarczyć własny plik wykonywalny deinstalacji, ale to, czy plik wykonywalny zawiera sposób na uruchomienie go bez GUI, zależy od indywidualnego pakietu oprogramowania.
Skrypt VBScript pomoże Ci odinstalować wymagany program.
Aby użyć tego skryptu, potrzebujesz nazwy oprogramowania, która znajduje się w rejestrze.
Wystarczy wpisać nazwę aplikacji w skrypcie i uruchomić ją z uprawnieniami administratora; odinstaluje aplikację. Ale będzie to działać tylko w przypadku aplikacji opartej na oknie; w przypadku samodzielnej konfiguracji lub aplikacji, które nie zawierają wpisu w ciągu rejestru odinstalowującego, skrypt nie będzie działał.
W takim przypadku będziesz musiał znaleźć inny sposób na odinstalowanie aplikacji.
Kod:
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
Sprawdź to, to jest za pomocą partii znaleźć klucz rejestru UninstallString oprogramowania, a następnie odinstalować oprogramowanie po cichu, co jest znacznie bardziej niezawodne w porównaniu do wmic znalazłem. 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>"
npwmic /node:"someuser-pc" product get name
. : Upewnij się, że używasz „” wokół nazwy, w przeciwnym razie wystąpi błąd „Nieprawidłowa zmiana globalna”. Upewnij się również, że uruchamiasz to z wiersza polecenia CMD, a nie z wiersza polecenia programu PowerShell, ponieważ obejście błędu „Nieprawidłowy przełącznik globalny” nie działa w wierszu polecenia programu PowerShell.