Відповіді:
Кожна програма, яка належним чином встановлюється відповідно до вказівок Microsoft, вносить запис у реєстр HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall
. Зазвичай ключовою для програми буде її GUID, а також назва програми. У межах цього ключа буде записаний запис UninstallString
. Тут міститься команда виконати для видалення програми.
Якщо ви вже заздалегідь знаєте, що ви будете видаляти, це може бути досить просто, щоб просто помістити це у свій пакетний файл. Це стає складним, коли ви намагаєтеся автоматизувати цей процес. Ви можете скористатися reg
командою для отримання даних з реєстру, але вона повертає багато тексту навколо фактичного значення заданого ключа, що ускладнює його використання. Ви можете поекспериментувати з використанням VBscript або PowerShell, оскільки вони мають кращі варіанти для отримання даних з реєстру в змінну.
Ви можете викликати правильну видалення програми, не знаючи GUID тощо, використовуючи WMIC.
Щоб побачити список імен програм, відомих всередині Windows:
wmic product get name
Шукайте назву вашого продукту. Він, ймовірно, відповідає тому, який вказаний на панелі керування "Програми та функції" , але не завжди.
Тоді можна використовувати
wmic product where name="_my_product_name" call uninstall
виконувати видалення, про що AFAIK повинен промовчати (це було, як на моєму досвіді, але спробуйте, перш ніж робити ставку на ферму. Тиша може залежати від того, як побудований ваш інсталятор / деінсталятор).
Дивіться тут докладніше:
На microsoft.com також є довідкова документація для WMIC.
Якщо у вас встановлено PowerShell 3 (або вище), ви можете надіслати виклик WMI, щоб усі програми були названі певною річчю (або "як" певна річ, щоб здійснити пошук підстановок), а потім викликати Uninstall
метод для кожної з них:
(Get-WmiObject -Query "SELECT * FROM Win32_Product WHERE Name like '%Partial Name%'").uninstall()
Якщо програма використовує інсталятор Windows, ви можете використовувати одну з таких команд:
msiexec /q /x <ProductCodeGuid>
msiexec /q /x <PathToMsi>
Однак ви, ймовірно, не маєте ні коду продукту, ні оригінального файлу MSI, який використовується для встановлення.
Крім цього, немає загальної команди для видалення, оскільки інсталятори, які не використовують інсталятор Windows, операційною системою "невідомі". Вони можуть поставити свій власний виконуваний файл для видалення, але чи включає цей виконуваний спосіб запуск його без GUI, залежить від індивідуального пакета програмного забезпечення.
Сценарій 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
Перевірте це, використовуючи пакет пошуку ключа реєстру 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
/node:"<ComputerName>"
приклад:wmic /node:"someuser-pc" product get name
. Будьте впевнені, що ви використовуєте "" ім'я навколо ", або ви зіткнетесь з помилкою" Недійсний глобальний комутатор ". Також переконайтеся, що ви запускаєте це з підказки CMD, а не підказки PowerShell, оскільки "" помилка "Недійсний глобальний комутатор" не працює в запиті PowerShell.