您可以在不知道GUID等的情况下通过WMIC调用正确的卸载程序。
查看Windows内部已知的程序名称列表。
wmic product get name
寻找你的产品名称. 它可能与“程序和功能”控制面板中列出的名称一致,但并不总是一致。
然后你可以使用
wmic product where name="_my_product_name" call uninstall
执行卸载,AFAIK应该是无声的(根据我的经验,它一直是无声的,但在你打赌之前先试试。沉默可能取决于你的安装程序/卸载程序是如何构建的)。)
更多信息请看这里。
在microsoft.com上也有WMIC的参考文档。
每一个根据微软的准则正确安装自己的程序都会在HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall
中建立一个注册表条目。通常,程序的键将是其GUID,否则就是程序的名称。在该键中会有一个名为UninstallString
的条目。这包含了卸载程序所要执行的命令。
如果你已经提前知道了要卸载的程序,那么把它放在批处理文件中就很容易了。但当你试图自动完成这个过程时,就会变得很棘手。你可以使用reg
命令从注册表中获取数据,但它会在给定键的实际值周围返回大量的文本,使其难以使用。你可能想尝试使用VBscript或PowerShell,因为它们有更好的选项来从注册表获取数据到变量中。
如果一个程序使用Windows Installer,你可以使用以下命令之一。
msiexec /q /x <ProductCodeGuid>
msiexec /q /x <PathToMsi>
然而,你很可能既没有产品代码,也没有用于安装的原始MSI文件。
除此之外,没有通用的卸载命令,因为没有使用Windows Installer的安装程序是操作系统 “未知 "的。他们可能会提供自己的卸载可执行文件,但该可执行文件是否包括不使用GUI的运行方式,取决于个别软件包。
看看这个,这是用批量找到软件的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
```。
一个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