Deinstalacja programów w trybie cichym za pomocą CMD


Odpowiedzi:


19

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ć regpolecenia, 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.


26

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.


2
Możesz uruchomić to na zdalnych komputerach, dodając /node:"<ComputerName>"np wmic /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.
Chris Magnuson

Świetna odpowiedź, ale niewielkim zastrzeżeniem jest to, że WMIC może zająć sporo czasu na wykonanie polecenia. Lista produktów zajęła około 3 minut na moim komputerze.
SmacL,

7

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ć Uninstallmetodę dla każdego z nich:

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


5

Jeśli wiesz, gdzie jest plik instalatora MSI, możesz użyć:

Msiexec / uninstall Application.msi / quiet


5

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.


1

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

1

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

0

Prawidłowa odpowiedź znajduje się powyżej, ale w przypadku instalacji systemu Windows X64 należy również sprawdzić:

HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.