通过CMD静默卸载程序


Answers:


19

根据Microsoft指南正确安装的每个程序都会在中创建一个注册表项HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall。通常,程序的密钥将是其GUID或程序的名称。该键中将包含一个名为的条目UninstallString。这包含执行以卸载程序的命令。

如果您已经提前知道将要卸载的内容,只需将其放入批处理文件中就足够了。但是,当您尝试使该过程自动化时,它将变得很棘手。您可以使用该reg命令从注册表中获取数据,但是该命令会在给定键的实际值附近返回很多文本,从而使其难以使用。您可能想尝试使用VBscript或PowerShell,因为它们具有更好的选项,可以将数据从注册表中获取到变量中。


26

您可以使用WMIC在不知道GUID等的情况下调用正确的卸载程序。

要查看Windows内部已知的程序名称列表,请执行以下操作:

wmic product get name

查找您的产品名称。它可能与“程序和功能”控制面板中列出的内容匹配,但并非总是如此。

那你可以用

wmic product where name="_my_product_name" call uninstall

要执行卸载,AFAIK应该保持沉默(这是我的经验,但是在对服务器场进行此押注之前尝试一下。沉默可能取决于安装程序/卸载程序的构建方式)。

看到这里更多:

microsoft.com上也有WMIC的参考文档。


2
您可以通过添加/node:"<ComputerName>"ex:在远程计算机上运行此命令wmic /node:"someuser-pc" product get name。请确保在名称周围使用“”,否则会遇到“无效的全局开关”错误。另外,请确保您是从CMD提示符而不是PowerShell提示符下运行此命令的,因为“无效全局开关”错误的“”解决方法在PowerShell提示符下不起作用。
克里斯·马格努森

1
很好的答案,但有一点需要注意的是,WMIC可能需要花费大量时间来执行命令。在我的PC上上市产品大约需要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 / quiet


5

如果程序使用Windows Installer,则可以使用以下命令之一:

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

但是,您可能既没有产品代码也没有用于安装的原始MSI文件。

除此之外,由于没有使用Windows Installer的安装程序对于操作系统是“未知的”,因此没有通用的卸载命令。他们可能会提供自己的卸载可执行文件,但是该可执行文件是否包括无需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注册表项,然后以静默方式卸载软件,这我发现的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

0

上面给出了正确的答案,但是对于Windows X64安装,您还需要检查:

HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.