Видалення програм безшумно через CMD


Відповіді:


19

Кожна програма, яка належним чином встановлюється відповідно до вказівок Microsoft, вносить запис у реєстр HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall. Зазвичай ключовою для програми буде її GUID, а також назва програми. У межах цього ключа буде записаний запис UninstallString. Тут міститься команда виконати для видалення програми.

Якщо ви вже заздалегідь знаєте, що ви будете видаляти, це може бути досить просто, щоб просто помістити це у свій пакетний файл. Це стає складним, коли ви намагаєтеся автоматизувати цей процес. Ви можете скористатися regкомандою для отримання даних з реєстру, але вона повертає багато тексту навколо фактичного значення заданого ключа, що ускладнює його використання. Ви можете поекспериментувати з використанням VBscript або PowerShell, оскільки вони мають кращі варіанти для отримання даних з реєстру в змінну.


26

Ви можете викликати правильну видалення програми, не знаючи GUID тощо, використовуючи WMIC.

Щоб побачити список імен програм, відомих всередині 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. Будьте впевнені, що ви використовуєте "" ім'я навколо ", або ви зіткнетесь з помилкою" Недійсний глобальний комутатор ". Також переконайтеся, що ви запускаєте це з підказки 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 / видалити Application.msi / тихо


5

Якщо програма використовує інсталятор Windows, ви можете використовувати одну з таких команд:

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

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

Крім цього, немає загальної команди для видалення, оскільки інсталятори, які не використовують інсталятор Windows, операційною системою "невідомі". Вони можуть поставити свій власний виконуваний файл для видалення, але чи включає цей виконуваний спосіб запуск його без GUI, залежить від індивідуального пакета програмного забезпечення.


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 програмного забезпечення, а потім непомітно видаліть програмне забезпечення, що набагато надійніше порівняти з нами, який я знайшов. 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.