65

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

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

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

4

7 回答 7

180

快递选项:

按产品 GUID 卸载:(查找产品 GUID)- 下面第 3 节进行日志记录。还有: MSI在这里深度记录

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 缓存文件夹,以及下面介绍的其他一些选项。

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

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


如果您在完全卸载时遇到问题并正在寻找已弃用的替代方案MsiZap.exe和/或 Windows Installer 清理实用程序 (MSICUU2.exe),您可以尝试微软的新 FixIt 工具或国际页面)。显然也适用于其他安装问题。

更新的清理方法列表:清理损坏的 MSI 卸载


如果您认为MSIWindows Installer带来的麻烦多于其价值,您可能想了解使用 MSI 文件的企业优势


Installscript MSI设置通常包含在setup.exe 文件中。要了解有关用于卸载此类设置的参数的更多信息,请参阅以下链接:setup.exe pdf 参考表Setup.exe 和 Update.exe 命令行参数


一些 MSI 文件通过诸如Burn (WiX Toolkit) 或InstallShield Suite项目之类的机制作为捆绑包的一部分安装。这会使卸载与下面看到的略有不同。这是InstallShield Suite 项目的示例


请注意,以静默方式或交互方式运行卸载可能会导致不同的结果 (!)。有关为什么会出现这种情况的详细说明,请阅读这篇文章:从控制面板卸载不同于从 .msi 中删除


如果在尝试卸载时意外要求您提供原始安装介质,请阅读此答案:为什么 MSI 需要原始 .msi 文件才能继续卸载?也许还有下面的第 12 节,了解一些重要的技术细节。


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


如果卸载完全失败(无法运行),请参阅下面的第 12 和 13 节,了解使用系统还原和/或清理工具“撤消”安装的潜在方法。


1 -Using the original MSI

  • 如果您有权访问用于安装的原始 MSI,您只需在Windows 资源管理器中右键单击它并选择Uninstall
  • 您也可以按照第 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

    • 开始 →</kbd> run →</kbd> appwiz.cpl →</kbd> ENTER in order to open the add/remove programs applet (or click add/ remove programs in the control panel)
    • 单击要卸载的产品的“删除”
  • 设置界面(Windows 8 / 10):

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

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 文件 -这是如何找到产品 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:使用刷新的详细日志文件进行交互式卸载详细,刷新到日志选项- 连续写入日志,可能非常慢):

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.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: 如何找到已安装 MSI 设置的产品 G​​UID?(如果您没有要在卸载命令中指定的原始 MSI,则用于卸载)。


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

  • MSI 删除所有 cab(旧 Windows 版本)并将每个安装在%SystemRoot%\Installer的超级隐藏系统文件夹中的 MSI 缓存(您需要显示隐藏文件才能看到它)。
  • 注意:这个超级隐藏的文件夹现在在 Windows 7 及以后的版本中被区别对待。MSI 文件现在全尺寸缓存。阅读链接的线程以获取更多详细信息 - 建议任何找到此答案并摆弄危险 Windows 设置的人阅读。
  • 通过使用管理员安装来避免这些巨大的缓存文件。关于磁盘空间的主题:如何摆脱巨大的缓存 MSI 文件(和其他磁盘空间清理技巧)
  • 此处的所有 MSI 文件都将分配一个随机名称(十六进制格式),但是您可以通过显示 Windows 资源管理器状态栏(查看 -> 状态栏)然后选择一个 MSI 来获取有关每个 MSI 的信息。来自 MSI 的摘要流将显示在 Windows 资源管理器窗口的底部。或者正如 Christopher Galpin 指出的那样,打开 Windows 资源管理器中的“评论”列并选择 MSI 文件(请参阅本文了解如何执行此操作)。
  • 关于使用 Windows 资源管理器的简短回答
  • 找到正确的 MSI 后,只需右键单击它并进行卸载。
  • 您还可以使用 PowerShell 显示本地缓存包的完整路径以及产品名称。这是我认为最简单的选择。
  • 要启动PowerShell按住 Windows 键,点击 R,释放 Windows 键,输入“powershell”,然后按 OK。然后最大化 PowerShell 窗口并运行以下命令:
  get-wmiobject Win32_Product | Format-Table Name, LocalPackage -AutoSize

在此处输入图像描述


5 -Using PowerShell

  • MSDN 上有一个类似但更全面的 PowerShell 脚本。它允许在多台机器上运行卸载。

  • Even Mien 添加的条目:

     $app = Get-WmiObject -Class Win32_Product -Filter "Name = 'YOUR_APP'"
     $app.Uninstall()
    
  • 这种方法可行,但访问 WMI 类 Win32_Product 将触发软件一致性检查,该检查速度非常慢,在特殊情况下可能会触发 MSI 自我修复。请参阅这篇文章:Powershell 卸载脚本 - 真的很头疼

  • 我自己没有对此进行测试,但似乎 $app.Uninstall() 可能会运行在 ARP 小程序的注册表设置中注册的 UninstallString。这意味着它在某些情况下可能会运行修改而不是卸载。

  • 查看此主题以获取更多详细信息以及通过 Powershell 卸载的方法:如何使用 PowerShell 卸载应用程序?


6 - Using the .NET DTF Class LibraryWiX 工具包的一部分)

    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

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

9 -Using Deployment Systems / Remote Administration Systems

  • SCCMCA UnicenterIBM 的 TivoliAltiris Client Management Suite 等
  • 这些工具具有高级客户端 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具有这样的卸载界面(并且它有免费版本)。我还应该补充一点,这个工具最近遭受了恶意软件攻击
  • 我想我们都应该记住,即使是无害的软件也可以在其下载位置注入恶意软件(FTP 攻击)。
    • 我使用virustotal.com检查我的下载,并使用Sysinternals Process Explorer在安装后检查正在运行的进程 - 以及常规安全软件(以可用者为准)。
    • 使用这种方法通常会发现数量惊人的“灰色区域”软件(工具栏、笑脸、广告软件等),以及一些误报(它们也可能导致问题,因为安全软件会阻止他们的访问或隔离他们进行很多绒毛)。当然还有真正的恶意软件。
    • 可以在此处找到 Process Explorer 的一些使用提示- 一系列推文 - 此 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。这是一个罕见的问题,但我自己也看到过。只有几个潜在的原因:移至此答案
    • 关键词:系统还原干扰、不良清理应用程序、msiexec.exe 崩溃、断电、安全软件干扰、MSI 开发调试错误(相同的包代码等)、用户修补和黑客攻击(这里有什么?节省空间?), ETC...
    • 它也可以用来破坏任何 MSI 安装,尽管这显然是不可取的。
    • 更多信息:为什么 MSI 需要原始 .msi 文件才能继续卸载?
  • 这个更新的支持工具(此工具现在也已弃用)如果您有需要卸载的失效 MSI 软件包,可以在最近的 Windows 版本上试用。
  • 有些人建议使用 saschabeaumont 链接到此处的工具:Uninstall without a MSI file。如果您尝试了它并且它有效,请务必让我们知道。
  • 如果您有权访问实际用于安装产品的原始 MSI,则可以使用它来运行卸载。它必须是所使用的确切 MSI,而不仅仅是类似的。

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

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

14 -Windows Installer Functions (C++)

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

serverfault.com 上有一个答案,作为卸载的不同编程方法(COM 自动化、.NET、Win32 安装程序功能)的总结,可能很有趣。

您将在下面找到一个 C++ 片段,显示如何Orca, 10.1.17134.12使用调用MsiConfigureProductEx 函数按产品代码卸载。要卸载另一产品,请将为您指定的 GUID 替换prodcode为您的产品的 GUID。要查找产品代码,请参阅此答案:如何找到已安装 MSI 设置的产品 G​​UID?

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

#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
}

截至 2018 年 9 月,该代码段是使用最新版本的Visual Studio 2017制作和测试的:

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

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

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

    • 当心 VS2017 中默认模板的更改,以及可能导致的奇怪错误:IntelliSense 引擎无法正常运行的错误太多
    • 2018 年 9 月更新:模板再次更改。我不再看到上述问题。
    • 代码中的 MSDN 链接列出了从 msiexec.exe 返回的可能的错误消息。
于 2009-06-28T22:32:12.040 回答
51

简短的回答:你不能。使用 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 文件时实际使用的命令行。

于 2009-01-16T10:46:17.300 回答
32

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

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

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

于 2010-01-21T23:09:28.580 回答
3

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

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

于 2009-01-16T10:44:03.233 回答
2

我会尝试以下语法 - 它适用于我。

msiexec /x filename.msi /q 
于 2009-02-03T17:17:07.350 回答
2
wmic product get name

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

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

于 2011-11-10T03:06:32.713 回答
-1

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

于 2009-01-16T10:46:01.730 回答