【问题标题】:Uninstalling an MSI file from the command line without using msiexec从命令行卸载 MSI 文件而不使用 msiexec
【发布时间】:2010-10-01 18:59:06
【问题描述】:

msiexec 是安装MSI 程序的命令提示符软件。但是我发现您可以通过在命令行中输入 MSI 文件的名称来从命令行安装 MSI 文件。

但为了卸载 MSI 文件,您似乎必须调用 msiexec 程序并给它一个 /x/uninstall

如何在不使用 msiexec 例程的情况下从命令行卸载 MSI?

【问题讨论】:

  • 您为什么要这样做?我只是好奇...
  • 如下所述,您实际上可以通过 VBScript 使用 Windows Installer Automation api,但据我所知,它可能在后台调用 msiexec.exe(但看起来它直接调用 msi. dll)。
  • 我会说这个问题属于“软件开发特有的实用、可回答的问题”的范围,因此应该重新打开。
  • 似乎这将用作测试/ ci的一部分。完全与我有关的编程。实际上,我有需要测试的安装程序以及卸载程序的软件。
  • 值得检查程序文件中是否有应用程序的卸载程序 - 即使您使用 msi 安装它可能已经提取了一个 unistaller 可执行文件

标签: .net installation command-line wix windows-installer


【解决方案1】:

快递选项:

按产品 GUID 卸载: (find product GUID) - 下面第 3 节用于记录。还有:MSI logging in depth here

msiexec.exe /x {11111111-1111-1111-1111-11111111111X}

通过 MSI 文件卸载:

msiexec.exe /x "c:\filename.msi"

快速互动:

Right click MSI file in Windows Explorer and select "Uninstall".

有很多方法可以卸载 MSI 软件包。以下内容仅供“参考”:

总之您可以通过以下方式卸载:msiexec.exeARPWMIPowerShell SCCMVBScript/COM 自动化、DTF 等部署系统,或通过隐藏的 Windows 缓存文件夹 strong>,以及下面介绍的其他一些选项。

前几段提供了重要的 MSI 花絮,然后有 14 个部分提供了卸载 MSI 文件的不同方法。噗。

“Babble, Babble - Over”: 12 部分3正常卸载方法(因此推荐)。 Personally I use option 3 or 5 from section 3(两个选项都带有日志记录,但选项 5 静默运行 以及)。如果你很忙,跳过所有的喋喋不休,去做一个 其中 - 它将完成工作。


如果您完全卸载时遇到问题,并且正在寻找已弃用的 MsiZap.exe 和/或 Windows Installer CleanUp Utility (MSICUU2.exe),你可以试试新的FixIt tool from Microsoft (or the international page)。显然也适用于其他安装问题。

较新的清理方法列表:Cleaning out broken MSI uninstalls


如果您认为 MSIWindows Installer 麻烦多于其价值,您可能想了解一下the corporate benefits of using MSI files


Installscript MSI 设置通常包含在 setup.exe 文件中。要详细了解用于卸载此类设置的参数,请参阅以下链接:setup.exe pdf reference sheetSetup.exe and Update.exe Command-Line Parameters


一些 MSI 文件通过 Burn (WiX Toolkit) 或 InstallShield Suite 项目等机制作为 bundles 的一部分安装。这会使卸载与下面看到的略有不同。这里是an example for InstallShield Suite projects


请注意,静默交互式运行卸载可能会导致不同的结果 (!)。如需详细说明为什么会出现这种情况,请阅读这篇文章:Uninstall from Control Panel is different from Remove from .msi


如果在尝试卸载时意外要求您提供原始安装介质,请阅读此答案:Why does MSI require the original .msi file to proceed with an uninstall?,也许还请阅读下面的第 12 节了解一些重要的技术细节。


如果您安装了CCleaner 或类似的清理工具,或许可以跳转到第 11 节


如果卸载完全失败(无法运行),请参阅下面的第 12 和 13 节,了解使用 system restore 和/ 或清理工具。


1 - Using the original MSI

  • 如果您有权访问用于安装的原始 MSI,您只需在 Windows 资源管理器右键单击它并选择卸载
  • 您也可以按照第 3 节中的说明通过命令行卸载。

2 - Using the old ARP Applet OR new Windows 8/10 Settings Interface

  • 虽然很明显,但还是要提一下正常的方法

  • ARP = Add / Remove Programs Applet (appwiz.cpl)

  • Windows 10 Settings Interface => 相同操作的新外壳

  • ARP

    • 开始 运行 appwiz.cpl ENTER 以打开添加/删除程序小程序(或单击控制面板中的添加/删除程序)
    • 点击您要卸载的产品的“删除
  • 设置界面(Windows 8 / 10):

    • 在 Windows 8 / 10 中使用新的设置 GUI
      • Windows 键 + 点击 I => Apps & Features。选择条目并卸载。
    • 直接快捷方式:
      • Windows 键 + 点击 R => 输入:ms-settings:appsfeatures 并按 Enter
    • 以这种方式调用卸载时出现一些错误报告。如果看到请在下面添加 cmets。

3 - Using msiexec.exe command line (directly or via a batch file)

  • 您可以通过命令提示符 (cmd.exe)、批处理文件甚至从可执行文件中作为shell操作
  • 您可以通过将 产品 GUID(查看下方以了解如何找到此 GUID)或原始 MSI 文件的路径(如果可用)传递给 msiexec.exe。
  • 对于下面的所有命令行,您可以添加/qn使卸载以静默模式运行。这是从添加/删除小程序触发卸载时运行的方式。

选项 3.1:基本交互式卸载(访问原始 MSI 文件):

msiexec.exe /x "c:\filename.msi"

选项 3.2:通过产品 GUID 进行基本交互式卸载(无法访问原始 MSI 文件 - here is how to find the product GUID - 与以下链接相同):

msiexec.exe /x {11111111-1111-1111-1111-11111111111X}

选项 3.3:使用详细日志文件进行交互式卸载

msiexec.exe /x "c:\filename.msi" /L*V "C:\msilog.log"
msiexec.exe /x {11111111-1111-1111-1111-11111111111X} /L*V "C:\msilog.log"

选项 3.4:使用刷新的详细日志文件进行交互式卸载verbose, flush to log option - 连续写入日志,可能非常慢):

msiexec.exe /x "c:\filename.msi" /L*V! "C:\msilog.log"
msiexec.exe /x {11111111-1111-1111-1111-11111111111X} /L*V! "C:\msilog.log"
  • flush to log 选项使卸载变慢,因为日志文件是连续写入的,而不是分批写入的。这样可以确保在设置崩溃时不会丢失日志缓冲区。

  • 换句话说,如果您的设置崩溃并且详细日志文件中没有有用的信息,请启用此选项。删除感叹号以关闭刷新到日志选项,卸载会更快。您仍然会得到详细的日志记录,但如前所述,可能会丢失一些日志缓冲区。

选项 3.5(推荐):使用详细日志文件进行静默卸载 - 禁止重新启动(不刷新日志 - 请参阅上一个选项了解这意味着什么):

msiexec.exe /x "c:\filename.msi" /QN /L*V "C:\msilog.log" REBOOT=R
msiexec.exe /x {11111111-1111-1111-1111-11111111111X} /QN /L*V "C:\msilog.log" REBOOT=R

快速参数说明(因为我推荐这个选项):

/X = run uninstall sequence
/QN = run completely silently
/L*V "C:\msilog.log"= verbose logging at path specified
{11111111-1111-1111-1111-11111111111X} = product guid of app to uninstall
REBOOT=R = prevent unexpected reboot of computer

再说一遍,如何找到产品 guid: How can I find the product GUID of an installed MSI setup?(如果您没有要在卸载命令中指定的原始 MSI,则用于卸载)。


4 - Using the cached MSI database in the super hidden cache folder

  • MSI 删除所有 cab(旧 Windows 版本)并将每个安装在 %SystemRoot%\Installer 的超级隐藏系统文件夹中的 MSI 缓存(您需要显示隐藏文件才能看到它)。
  • 注意:这个超级隐藏的文件夹现在在 Windows 7 及以后的版本中被区别对待。 MSI files are now cached full-size。阅读链接的主题以了解更多详细信息 - 建议任何找到此答案并摆弄危险 Windows 设置的人阅读。
  • Avoid these huge cached files by using admin installations。关于磁盘空间的话题:How can I get rid of huge cached MSI files (and other disk space cleanup tricks)
  • 此处的所有 MSI 文件都将分配一个随机名称(十六进制格式),但您可以通过显示 Windows 资源管理器状态栏(查看 -> 状态栏)然后选择一个 MSI 来获取有关每个 MSI 的信息。来自 MSI 的摘要流将显示在 Windows 资源管理器窗口的底部。或者正如 Christopher Galpin 指出的那样,打开 Windows 资源管理器中的“评论”列并选择 MSI 文件 (see this article for how to do this)。
  • Short answer on using Windows Explorer
  • 找到正确的 MSI 后,只需右键单击它并卸载。
  • 您还可以使用 PowerShell 显示本地缓存包的完整路径以及产品名称。这是我认为最简单的选择。
  • 要启动 PowerShell按住 Windows 键,点击 R,松开 Windows 键,输入“powershell”并按 OK。然后最大化 PowerShell 窗口并运行以下命令:
  get-wmiobject Win32_Product | Format-Table Name, LocalPackage -AutoSize


5 - Using PowerShell


6 - Using the .NET DTF Class Librarythe WiX toolkit 的一部分)

    using Microsoft.Deployment.WindowsInstaller;

    public static void Uninstall( string productCode)
    {
      Installer.ConfigureProduct(productCode, 0, InstallState.Absent, "REBOOT=\"R\"");
    }

7 - Using the Windows Installer Automation API


8 - Using a Windows Installer major upgrade

  • Windows Installer 主要升级可能会作为安装另一个 MSI 文件的一部分发生。
  • 通过在 MSI 的“Upgrade table”中标识相关产品来进行重大升级。然后按照表中的规定处理这些相关设置。通常这意味着它们已被卸载,但也可以中止主设置(通常用于检测盒子上存在的您自己的应用程序的更高版本)。

9 - Using Deployment Systems / Remote Administration Systems

  • SCCMCA UnicenterIBM's TivoliAltiris 客户端管理套件等
  • 这些工具具有高级客户端 PC 管理功能,包括安装和卸载 MSI 文件
  • 这些工具似乎结合了 msiexec.exe、自动化、WMI 等...甚至它们自己调用安装和卸载的方式。
  • 根据我的经验,这些工具具有很多“个性”,您需要适应它们不同的做事方式。

10 - Using WMI - Windows Management Instrumentation


11 - Using a third-party tool such as ccleaner or similar

  • 一些 Windows 应用程序具有自己的界面,不仅可以卸载 MSI 软件包,还可以卸载旧版安装程序。
  • 我不想在这里提出任何具体的工具推荐(尤其是商业工具),但是众所周知的CCleaner 具有这样的卸载界面(并且它有免费版本)。我还应该补充一下this tool suffered a malware attack recently
  • 我想我们都应该记住,即使是无害的软件也可以在其下载位置注入恶意软件(FTP 攻击)。
    • 我使用virustotal.com 检查我的下载,还使用Sysinternals Process Explorer 在安装后检查正在运行的进程 - 以及常规安全软件(以可用者为准)。
    • 使用这种方法通常会发现数量惊人的“灰色区域”软件(工具栏、笑脸、广告软件等),以及一些误报(它们也可能导致问题,因为安全软件会阻止其访问或隔离他们做了很多绒毛)。当然还有真正的恶意软件。
    • Some usage tips for Process Explorer can be found here - 一系列推文 - 此 Process Explorer 工具连接到 VirusTotal.com 以交互方式检查所有正在运行的进程 - 您只需要几个配置步骤。
    • 我应该注意到 Process Explorer 会产生文件签名检查,但没有启发式方法 - 据我所知(没有检查可疑操作,只是检查了 60 多个安全套件对标记文件的检查)。您需要一个常规的安全工具来进行交互式在线启发式保护。
    • 就其价值而言,我认为某些安全软件造成的误报问题比恶意软件造成的损害还多。勒索软件时代著名的遗言...
    • 这是一个足够大的题外话 - 我只是不想看到人们下载恶意软件。至少检查一下virustotal.com
  • 像这样卸载应该可以正常工作。我认为当您尝试它们的“清理功能”时,这些工具会搞砸太多事情。谨慎使用。如果只使用卸载功能,应该没问题。

12 - Using a cleanup tool such as msizap or similar

  • 为了完整起见,应提及 msizap.exe,尽管它已弃用不支持过时。不应在任何较新的 Windows 版本上使用它
  • 此命令行工具 (msizap.exe) 也有一个可用的 GUI (MSICUU2.exe)。这两种工具都已弃用。
  • 这些工具的预期用途是清除失败的卸载
  • 通常在极少数情况下,带有随机名称的缓存 MSI 错误丢失,因此在请求原始 MSI 时卸载失败。这是一个罕见的问题,但我自己也看到过。只是一些潜在的原因:Moved to this answer
    • 关键词:系统还原干扰、不良清理应用程序、msiexec.exe 崩溃、断电、安全软件干扰、MSI 开发调试错误(相同的包代码等)、用户修补和黑客攻击(这里有什么? 节省空间?)等...
    • 它也可用于破坏任何 MSI 安装,但显然不建议这样做。
    • 更多信息:Why does MSI require the original .msi file to proceed with an uninstall?
  • This newer support tool(这个工具现在也被弃用了)如果你有失效的 MSI 包需要卸载,可以在最近的 Windows 版本上试用。
  • 有些人建议使用 saschabeaumont 链接到此处的工具:Uninstall without an MSI file。如果您尝试过并且有效,请务必告知我们。
  • 如果您有权访问实际用于安装产品的原始 MSI,则可以使用它来运行卸载。它必须是所使用的确切 MSI,而不仅仅是类似的。

13 - Using system restore ("installation undo" - last resort IMHO)

  • 严格来说,这不是“卸载”的方法,而是“撤消”最后一次安装或多次安装的方法。
  • 通过还原点进行还原会使系统恢复到之前的安装状态(您可以在 YouTube 或类似网站上找到这方面的视频演示)。
  • 请注意,该功能可以完全或部分禁用 - 可以永久禁用整台机器,也可以在每次安装时临时禁用。
  • 我看到了系统还原导致的新的、无法解决的安装问题,但通常它可以正常工作。显然不要为了好玩而使用该功能。这是最后的手段,最适用于回滚新驱动程序或刚刚安装并被发现会立即导致问题(bluescreen、重新启动、不稳定等)的设置。
  • 返回的时间越长,您为自己创建的返工就越多,风险也就越高。大多数系统只有几个还原点,而且我相信它们中的大多数只能恢复一两个月。
  • 请注意,系统还原可能会影响必须重新应用的 Windows 更新 - 以及许多其他系统设置。除了纯粹的烦恼之外,这还可能导致安全问题再次出现,您可能希望使用 Microsoft Baseline Security Analyzer 或类似工具对目标框运行特定的安全检查。
  • 既然我提到了系统还原,我想我应该提到the Last Known Good Configuration feature。此功能与卸载或系统还原无关,但它是最后一次有效或导致系统运行的引导配置。如果系统在引导过程中蓝屏或停止,它可用于让您的系统再次运行。这通常发生在驱动程序安装后。

14 - Windows Installer Functions (C++)

为了完整起见,我想我们应该提到这一切的核心 - 深入浅出的方式:the Win32 Windows Installer API functions。这些可能是大多数(如果不是所有上面列出的“引擎盖下”的其他方法的话)所使用的功能。它们主要由直接将 MSI 作为一种技术处理的应用程序或解决方案使用。

在 serverfault.com 上有一个答案,可能是 a summary of the different programmatic approaches for uninstalling(COM 自动化、.NET、Win32 安装程序函数)。

您将在下面找到一个 C++ sn-p,它显示了如何使用对 MsiConfigureProductEx function 的调用按产品代码卸载 Orca, 10.1.17134.12。要卸载其他产品,请将为 prodcode 指定的 GUID 替换为您的产品的 GUID。要查找产品代码,请参阅此答案:How can I find the product GUID of an installed MSI setup?

卸载将在全 GUI 模式下进行。要在静默模式或其他一些 GUI 模式(精简、基本等)下运行,请参阅:MsiSetInternalUI function

#include "pch.h"

#define WIN32_LEAN_AND_MEAN //Minimize includes from Windows.h
#include <windows.h>
#include <msi.h> // Windows Installer
#include <tchar.h> 

#pragma comment(lib, "msi.lib") // To make code link

int main()
{
    const TCHAR noreboot[] = _T("REBOOT=ReallySuppress");
    const TCHAR prodcode[39] = _T("{D7B80ABC-1950-37B8-F851-C3783EED9C93}"); // Orca, 10.1.17134.12

    UINT res = MsiConfigureProductEx(prodcode, INSTALLLEVEL_DEFAULT, INSTALLSTATE_ABSENT, noreboot);

    return res; // Error Codes: https://msdn.microsoft.com/en-us/library/windows/desktop/aa376931(v=vs.85).aspx
}

sn-p 是使用截至 2018 年 9 月的最新版本 Visual Studio 2017 制作和测试的:

  1. 从 Visual C++ => Windows 桌面创建一个新的“Windows 控制台应用程序”。

  2. 将上述代码复制并粘贴到您的主 CPP 文件中(替换其中的任何内容)。

  3. 应该是它能够运行代码。也许设置一个断点,构建并运行。

【讨论】:

  • 如果您想要更简单的方法来处理复杂的 msiexec.exe 语法,您可以使用 Wise 提供的免费工具:serverfault.com/questions/30068/silent-install-of-msi/…
  • 关于 %SystemRoot%\Installer,只要打开“评论”栏就容易多了。
  • 不幸的是,Windows Installer Automation Api 链接已失效,Google 和 WayBackMachine™ 没有缓存。您可以使用新链接更新您的答案吗?谢谢!
  • @Dennis - +1 完美的例子,说明为什么必须在搜索者找到的信息源上存储副本(顺便说一句,不要让连续的人每次搜索相同的后续信息)。
  • 12. There are certainly further possible causes. 磁盘空间不足,管理员摆脱了包含 cab 的巨大、设计不良的 msi 文件,索引消失了。
【解决方案2】:

简短的回答:你不能。使用 MSIEXEC /x

长答案:当您直接在命令行运行 MSI 文件时,所发生的只是它为您运行 MSIEXEC。此关联存储在注册表中。您可以通过(在 Windows 资源管理器中)转到工具/文件夹选项/文件类型来查看关联列表。

例如,您可以从命令行运行 .DOC 文件,WordPad 或 WinWord 将为您打开它。

如果您查看HKEY_CLASSES_ROOT\.msi 下的注册表,您会看到 .MSI 文件与 ProgID“Msi.Package”相关联。如果您查看HKEY_CLASSES_ROOT\Msi.Package\shell\Open\command,您将看到 Windows 在“运行” .MSI 文件时实际使用的命令行。

【讨论】:

  • 您实际上可以通过替换注册表中的命令来包含选项 /x。但我确信没有人愿意这样做,因为如果你这样做了,你就不能再通过双击来安装 msi。
  • 不确定我是否同意roger-lipscombe 的“你不能”。在我的 WinXP 安装中,HKEY_CLASSES_ROOT\Msi.Package\shell\Open\command 包含 "%SystemRoot%\System32\msiexec.exe" /i "%1" %*。似乎有人愿意指定/i 安装在cmd.exe 中,他们可以(默认情况下)只指定MSI 文件名;然后他们可以将该注册表值更改为"%SystemRoot%\System32\msiexec.exe" "%1" %* 以允许在cmd.exe 中指定/x 开关,然后右键单击MSI 以访问(至少)GUI 中的安装选项。
  • 我赌 1000 美元,我可以在不调用 msiexec.exe 的情况下以编程方式卸载 MSI。您可以改用 API 调用。但是,您可能会猜到哪些 EXE 将被这些 API 调用调用。 :)
  • 好吧,你不能从命令行运行 .DOC 文件,除非你有Command Extensions 启用。他们通常是这样的。
【解决方案3】:

还请记住,可以使用 WMIC 命令启动卸载:

wmic product get name --> 这将列出所有已安装应用程序的名称

wmic product where name='myappsname' call uninstall --> 这将卸载应用程序。

【讨论】:

  • 请注意,wmic 可能需要 long 时间才能返回结果,看起来它已挂起,但可能不是。这是 wmic 的一个很好的参考页面:quux.wiki.zoho.com/WMIC-Snippets.html
  • 注意请参阅matt-wilkiecomment,了解wmic product get name 的全局搜索开销
【解决方案4】:

msi 文件扩展名映射到 msiexec(与在命令提示符下键入 .txt 文件名启动记事本/默认 .txt 文件处理程序以显示文件的方式相同。

因此,键入带有 .msi 扩展名的文件名确实会以 MSI 文件作为参数运行 msiexec,并采用默认操作安装。因此,卸载需要您调用带有卸载开关的 msiexec 来卸载它。

【讨论】:

  • 请参阅我的comment,了解如何更改默认操作,如果您可以接受删除默认操作 -- 可能更常用 -- 操作。
【解决方案5】:
wmic product get name

只是让 cmd 卡住了......几分钟后仍然闪烁_

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall,如果你能找到你要安装的软件名称的文件夹(不是以ProductCode命名的那个),UninstallString指向应用程序自己的卸载程序C:\Program Files\Zune\ZuneSetup.exe /x

【讨论】:

  • 返回结果可能需要很长时间。在我的四核双至强 win7 机器 wmic product where "Vendor like '%Microsoft%'" get Name, Version(取自 stackoverflow.com/a/1483166/14420)上,这个较短的范围请求大约需要 20 秒
【解决方案6】:

我会尝试以下语法 - 它对我有用。

msiexec /x filename.msi /q 

【讨论】:

  • -1 - OP 似乎已经知道这个选项,并且特别想知道是否有办法明确地启动 msiexec
【解决方案7】:

我假设当您在命令行中键入 int file.msi 时,Windows 会自动为您调用 msiexec file.msi。我假设这是因为当您输入 picture.png 时,它会调出默认的图片查看器。

【讨论】:

  • -1 - 我觉得这个答案的内容已经在这个问题的其他答案中更明确地涵盖了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 2014-02-24
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多