Ответы:
Каждая программа, которая правильно устанавливает себя в соответствии с рекомендациями Microsoft, делает запись в реестре HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall
. Обычно ключом для программы является ее GUID или имя программы. В этом ключе будет запись называется UninstallString
. Он содержит команду, которую нужно выполнить, чтобы удалить программу.
Если вы заранее знаете, что будете удалять, это должно быть достаточно просто, чтобы поместить это в ваш командный файл. Это становится сложно, когда вы пытаетесь автоматизировать этот процесс, хотя. Вы можете использовать reg
команду для получения данных из реестра, но она возвращает много текста о фактическом значении данного ключа, что затрудняет его использование. Возможно, вы захотите поэкспериментировать с использованием VBscript или PowerShell, так как у них есть лучшие варианты для получения данных из реестра в переменную.
Вы можете вызвать правильный деинсталлятор, не зная GUID и т. Д., Используя WMIC.
Чтобы увидеть список имен программ, известных Windows в 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, «неизвестны» операционной системе. Они могут предоставить свой собственный исполняемый файл для удаления, но включает ли этот исполняемый файл способ его запуска без графического интерфейса, зависит от отдельного программного пакета.
Сценарий 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 программного обеспечения, а затем удалить программное обеспечение в режиме без вывода сообщений, что является гораздо более надежным по сравнению с 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
/node:"<ComputerName>"
пример:wmic /node:"someuser-pc" product get name
. Убедитесь, что вы используете «» вокруг имени, иначе вы столкнетесь с ошибкой «Invalid Global Switch». Также убедитесь, что вы запускаете это из приглашения CMD, а не из приглашения PowerShell, поскольку «» обходной путь для ошибки «Недопустимый глобальный коммутатор» не работает в приглашении PowerShell.