Deinstalacja programów w trybie cichym za pomocą CMD

30

Czy istnieje sposób, w jaki mogę odinstalować programy bez interfejsu graficznego i robienia tego przez CMD?

kb67
źródło

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.

nhinkle
źródło
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.

Carnot Antonio Romero
źródło
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()

Ƭᴇcʜιᴇ007
źródło
5

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

Msiexec / uninstall Application.msi / quiet

Steve
źródło
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.

Stephen Jennings
źródło
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
Vino
źródło
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
Marcus Zheng
źródło
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\
iskry
źródło