Удаление программ без вывода сообщений через CMD


Ответы:


19

Каждая программа, которая правильно устанавливает себя в соответствии с рекомендациями Microsoft, делает запись в реестре HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall. Обычно ключом для программы является ее GUID или имя программы. В этом ключе будет запись называется UninstallString. Он содержит команду, которую нужно выполнить, чтобы удалить программу.

Если вы заранее знаете, что будете удалять, это должно быть достаточно просто, чтобы поместить это в ваш командный файл. Это становится сложно, когда вы пытаетесь автоматизировать этот процесс, хотя. Вы можете использовать regкоманду для получения данных из реестра, но она возвращает много текста о фактическом значении данного ключа, что затрудняет его использование. Возможно, вы захотите поэкспериментировать с использованием VBscript или PowerShell, так как у них есть лучшие варианты для получения данных из реестра в переменную.


26

Вы можете вызвать правильный деинсталлятор, не зная GUID и т. Д., Используя WMIC.

Чтобы увидеть список имен программ, известных Windows в Windows:

wmic product get name

Ищите название вашего продукта. Вероятно, он совпадает с тем, что указан на панели управления «Программы и компоненты» , но не всегда.

Тогда вы можете использовать

wmic product where name="_my_product_name" call uninstall

выполнить деинсталляцию, о которой AFAIK должен молчать (это было в моем опыте, но попробуйте, прежде чем ставить ферму на это. Молчание может зависеть от того, как был создан ваш установщик / деинсталлятор).

Смотрите здесь для получения дополнительной информации:

На microsoft.com есть также справочная документация для WMIC.


2
Вы можете запустить на удаленные компьютеры, добавив /node:"<ComputerName>"пример: wmic /node:"someuser-pc" product get name. Убедитесь, что вы используете «» вокруг имени, иначе вы столкнетесь с ошибкой «Invalid Global Switch». Также убедитесь, что вы запускаете это из приглашения CMD, а не из приглашения PowerShell, поскольку «» обходной путь для ошибки «Недопустимый глобальный коммутатор» не работает в приглашении PowerShell.
Крис Магнусон

1
Отличный ответ, но небольшая оговорка в том, что WMIC может потребоваться значительное количество времени для выполнения команды. Перечисление продуктов заняло около 3 минут на моем ПК.
SmacL

Должным образом отмечено, @SmacL. У меня был только случай, чтобы использовать это несколько раз, и в зависимости от того, что в вашей системе, я могу поверить, что это займет некоторое время.
Карно Антонио Ромеро

7

Если у вас установлен PowerShell 3 (или выше), вы можете выполнить WMI-вызов, чтобы все программы назвали определенную вещь (или «как» определенную вещь, чтобы выполнить поиск с подстановочными знаками), а затем вызвать Uninstallметод для каждой из них:

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


5

Если вы знаете, где находится файл установщика MSI, вы можете использовать:

Msiexec / удалить приложение.msi / quiet


5

Если программа использует установщик Windows, вы можете использовать одну из следующих команд:

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

Однако, скорее всего, у вас нет ни кода продукта, ни исходного файла MSI, используемого для установки.

Кроме этого, нет общей команды удаления, поскольку установщики, которые не используют установщик Windows, «неизвестны» операционной системе. Они могут предоставить свой собственный исполняемый файл для удаления, но включает ли этот исполняемый файл способ его запуска без графического интерфейса, зависит от отдельного программного пакета.


1

Сценарий VBScript поможет вам удалить требуемую программу.

Для использования этого скрипта вам потребуется имя программного обеспечения, которое находится в вашем реестре.

Просто введите имя приложения в скрипт и запустите его с правами администратора; это удалит приложение. Но это будет работать только для оконного приложения; для автономной установки или приложений, которые не вносят записи в строку удаления реестра, скрипт не будет работать.

Так что в этом случае вам придется найти другой способ удалить приложение.

Код:

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

Проверьте это, это с помощью пакета найти ключ реестра UninstallString программного обеспечения, а затем удалить программное обеспечение в режиме без вывода сообщений, что является гораздо более надежным по сравнению с 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

0

Правильный ответ выше, но для установки Windows X64 вам также необходимо проверить:

HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.