Answers:
根据Microsoft指南正确安装的每个程序都会在中创建一个注册表项HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall
。通常,程序的密钥将是其GUID或程序的名称。该键中将包含一个名为的条目UninstallString
。这包含执行以卸载程序的命令。
如果您已经提前知道将要卸载的内容,只需将其放入批处理文件中就足够了。但是,当您尝试使该过程自动化时,它将变得很棘手。您可以使用该reg
命令从注册表中获取数据,但是该命令会在给定键的实际值附近返回很多文本,从而使其难以使用。您可能想尝试使用VBscript或PowerShell,因为它们具有更好的选项,可以将数据从注册表中获取到变量中。
您可以使用WMIC在不知道GUID等的情况下调用正确的卸载程序。
要查看Windows内部已知的程序名称列表,请执行以下操作:
wmic product get name
查找您的产品名称。它可能与“程序和功能”控制面板中列出的内容匹配,但并非总是如此。
那你可以用
wmic product where name="_my_product_name" call uninstall
要执行卸载,AFAIK应该保持沉默(这是我的经验,但是在对服务器场进行此押注之前尝试一下。沉默可能取决于安装程序/卸载程序的构建方式)。
看到这里更多:
microsoft.com上也有WMIC的参考文档。
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>"
ex:在远程计算机上运行此命令wmic /node:"someuser-pc" product get name
。请确保在名称周围使用“”,否则会遇到“无效的全局开关”错误。另外,请确保您是从CMD提示符而不是PowerShell提示符下运行此命令的,因为“无效全局开关”错误的“”解决方法在PowerShell提示符下不起作用。