不使用msiexec从命令行卸载MSI文件

msiexec是安装MSI程序的命令提示符软件。 但是我发现只要在命令行中inputMSI文件的名称,就可以从命令行安装MSI文件。

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

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

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

长的答案:当你直接在命令行运行MSI文件时,所发生的一切就是它为你运行MSIEXEC。 这个关联存储在registry中。 你可以看到一个关联列表(在Windows资源pipe理器中)转到工具/文件夹选项/文件types。

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

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

有许多方法可以卸载MSI软件包。 这是作为“参考”。

前几个段落提供了重要的MSI花絮,然后有13个部分用不同的方式卸载一个MSI文件。 PUH。

1,23部分是正常的卸载方法 (因此推荐)。 我个人使用第3部分中的选项3或5(这两个选项都有日志logging,但选项5也默默运行)。 如果你很忙 ,跳过所有的喋喋不休,并去其中一个 – 它会完成工作。


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


如果您认为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.使用原始的MSI

  • 如果您可以访问用于安装的原始MSI,只需在Windows资源pipe理器中 右键单击它,然后select卸载
  • 您也可以通过命令行进行卸载,如第3节所述。

2.使用ARP(添加/删除程序)Applet

  • 只是要提到正常的方法,虽然这是显而易见的
  • 开始 运行 appwiz.cpl ENTER以打开添加/删除程序小程序(或点击控制面板中的添加/删除程序)
  • 点击“ 删除 ”您想要卸载的产品。

3.使用msiexec.exe命令行 (直接或通过batch file)

  • 您可以通过命令提示符cmd.exe ), batch file或甚至从可执行文件内部卸载,作为shell操作
  • 您可以通过将产品GUID (如何查找此GUID )或原始MSI文件的path(如果可用)传递给msiexec.exe来完成此操作
  • 对于下面的所有命令行,您可以添加/qn使卸载以静默模式运行 。 这是从添加/删除小程序触发的卸载运行方式。

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

        msiexec.exe /x "c:\filename.msi" 
    • 选项2:通过产品GUID进行基本的交互式卸载 (不能访问原始MSI文件 – 这里是如何find产品GUID – 与下面相同的链接):

        msiexec.exe /x {11111111-1111-1111-1111-11111111111X} 
    • 选项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" 
    • 选项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" 
      • 刷新日志选项使得卸载速度变慢,因为日志文件是连续写入而不是批量写入的。 这确保如果安装程序崩溃,则不会丢失日志缓冲区。
      • 请注意,MSI中的特定自定义操作可能会在安装回滚的情况下崩溃(指定忽略退出代码)。 刷新logging可以帮助捕获这类信息。
      • 换句话说, 如果您的安装程序崩溃并且您的详细日志文件中没有有用的信息,请启用此选项 。 删除感叹号closures刷新日志选项和卸载将更快。 你仍然得到详细的日志logging,但如上所述,一些日志缓冲区可能会丢失。
    • 选项5(推荐):使用详细的日志文件进行无人值守的卸载 (无需刷新到日志 – 请参阅上一个选项了解其含义):

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

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

        /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. 

      再次,如何find产品GUID: 如何find已安装的MSI设置的产品GUID? (如果您没有要在卸载命令中指定的原始MSI,请进行卸载)。

  • 重要提示 :如果您为卸载创build日志文件,则可以通过search“值3”来查找日志中的问题。 这对于冗长的文件特别有用,因为它们是如此,详细:-)。

  • 如何find已安装的MSI的产品GUID

    • 有几种方法,我推荐的方法是使用Powershell: 如何find已安装的MSI安装程序的产品GUID?
    • 这里描述的其他几种方法(registry,本地caching文件夹等): 从MSI文件中查找GUID
  • 有关从installsite.orglogin的更多信息: 如何创build我的安装的日志文件 ? – 不同的选项和InstallShield日志的具体细节。

  • Msiexec(命令行选项) – 来自MSDN的 msiexec.exe命令行概述。 这里是Technet版本

4.在超级隐藏caching文件夹中使用caching的MSI数据库

  • MSI去除所有出租车(较旧的Windows版本)并caching安装在%SystemRoot%\ Installer超级隐藏系统文件夹中的每个MSI(您需要显示隐藏文件才能看到它)。
  • 注意 :这个晚饭隐藏的文件夹现在在Windows 7以上被区别对待。 MSI文件现在caching为全尺寸 。 阅读链接线程的更多细节 – build议阅读任何人谁发现这个答案和摆弄危险的Windows设置。
  • 这里所有的MSI文件都会分配一个随机的名字(hex格式),但是你可以通过显示Windows资源pipe理器的状态栏(View – > Status Bar),然后select一个MSI来获得每个MSI的信息。 MSI的汇总stream将显示在Windows资源pipe理器窗口的底部。 或者像Christopher Galpin指出的那样,打开Windows资源pipe理器中的“注释”列并selectMSI文件( 请参阅这篇文章了解如何操作 )。
  • 一旦你find正确的微星,只需右键点击它,并去卸载。
  • 您还可以使用PowerShell显示本地caching包的完整path以及产品名称。 在我看来,这是最简单的select。
  • 要启动PowerShell按住Windows键,点击R,释放Windows键,键入“powershell”,然后按OK 。 然后最大化PowerShell窗口并运行下面的命令:
  get-wmiobject Win32_Product | Format-Table Name, LocalPackage -AutoSize 

在这里输入图像说明

  • 另请参阅此答案: 如何查找已安装的MSI安装程序的产品GUID?

5.使用PowerShell

  • 在MSDN上一个类似但更全面的PowerShell脚本 。 它允许卸载在几台机器上运行。
  • Even Mien补充说:

     $app = Get-WmiObject -Class Win32_Product -Filter "Name = 'YOUR_APP'" $app.Uninstall() 
  • 这种方法是可行的,但访问WMI类Win32_Product会触发一个非常缓慢软件一致性检查 ,在特殊情况下可能导致MSI自我修复被触发。 看到这篇文章: Powershell卸载脚本 – 有一个真正的头痛

  • 我没有自己testing过,但是看起来$ app.Uninstall()可能会运行注册在ARP applet的registry设置中的UninstallString。 这意味着它可能会运行修改,而不是在某些情况下卸载。
  • 查看这个主题了解更多详细信息和通过Powershell卸载的方法: 如何使用PowerShell卸载应用程序?

6.使用.NET DTF类库 ( WiX工具包的一部分)

  • 这个选项包含在进入部署和MSI的开发者当中 – 作为一个“快速修复”并不实际。 它要求你下载WiX工具包 – 一个用于创build从XML源文件编译的MSI文件的免费框架。
  • 对WiX及其“历史”的简短介绍: Windows安装程序和WiX的创build 。 在这里,WiX与其他部署工具(商业)相比较 (优点和缺点 – 希望尽可能客观)。
  • 如下所述,DTF (部署工具基础)作为WiX的一部分进行分发: 部署工具基础的源代码是否可用? 。
  • DTF本质上是Win32 Windows Installer API.NET包装器 。 它通过自动化使用Windows Installer来消除所有对COM Interop的需求,并且毫无疑问是一款.NETgem也许是我见过的最容易使用的.NET库。 强烈build议 – 即使在C#培训学生也很好
  • 以下来源于MSI专家Christopher Painter使用C#和DTF。 Microsoft.Deployment.WindowsInstaller是DTF程序集之一。 在serverfault.com上查看这里解释的其他程序集 :
  using Microsoft.Deployment.WindowsInstaller; public static void Uninstall( string productCode) { Installer.ConfigureProduct(productCode, 0, InstallState.Absent, "REBOOT=\"R\" /l*v uninstall.log"); } 
  • Tom Blodget的另一种select: 检查是否成功卸载
  • 有关msiexec.exe自动化的更多信息,请访问: serverfault.com

7.使用Windows Installer自动化API

  • 以下是关于此选项的社区讨论: Windows安装程序自动化API社区示例
  • API可以通过脚本自动化和C ++ API调用来访问(我的文章在serverfault.com上)
  • 下面是MSI专家Christopher Painter使用VBScript的源代码:

     Const msiUILevelNone = 2 Set objInstaller = CreateObject("WindowsInstaller.Installer") objInstaller.UILevel = msiUILevelNone objInstaller.InstallProduct( "product.msi", "REMOVE=ALL") Set objInstaller = Nothing 
  • 以下是另一个用于从Symantec的GUID进行卸载的VBScript: http : //www.symantec.com/connect/downloads/uninstall-application-using-guid-registry


8.使用Windows安装程序主要升级

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

9.使用高级部署系统/远程pipe理系统

  • SCCM , CA Unicenter , IBM的Tivoli , Altiris客户端pipe理套件等等
  • 这些工具具有先进的客户端PCpipe理function,包括安装和卸载MSI文件
  • 这些工具似乎使用了msiexec.exe,自动化, WMI等的组合,甚至他们自己的方式来调用安装和卸载。
  • 根据我的经验,这些工具具有很多“个性”,你需要适应不同的做事方式。

10.使用WMI – Windows Management Instrumentation

  • 只是为了完整而添加。 因为速度很慢 ,所以不推荐使用这种方法
    • 每次调用Win32_Product时 ,都会触发一次软件一致性检查
    • 一致性检查非常慢 ,也可能引发软件修复 。 看到这篇文章: Powershell卸载脚本 – 有一个真正的头痛
    • 更糟糕的是, 有些人报告他们的事件日志中充满了MsiInstaller EventID 1035条目 – 显然是由WMI查询引起的Win32_Product类(我个人从来没有见过这个)。
  • WMICodeCreator.exe代码创build工具可用于实验
    • 安装可以通过Win32_Product.Install调用
    • 卸载可以通过Win32_Product.Uninstall进行调用
  • MSDN示例: 卸载Win32_Product类的方法

11.使用第三方工具,如ccleaner或类似的

  • 几个Windows应用程序具有自己的界面,不仅可以卸载MSI软件包,还可以卸载旧版安装程序
  • 我不想在这里提供任何具体的工具build议,但众所周知的CCleaner具有这样的卸载界面
  • 卸载像这样应该可以。 我认为这些工具在尝试“清理function”时会遇到太多的问题。 谨慎使用。 如果你只使用卸载function,你应该没问题。

12.使用清理工具,如 的MSIZap 或类似的

  • 为了完整 MSIZAP.EXE 应该被提及,虽然它被弃用支持过时 。 它不应该用于任何更新的Windows版本
  • 这个命令行工具( MSIZAP.EXE )也有一个可用的GUI( MSICUU2.exe )。 这两个工具都被删除。
  • 这些工具的预期用途是清除失败的卸载
    • 一般情况下,当随机名称的cachingMSI错误地丢失,并且由于这个原因卸载失败时,要求原始MSI
      • 这是一个罕见的问题,但我自己也看到了。 只是一些潜在的原因:
        • 干扰系统还原 ? 以前的系统映像恢复意外删除caching的MSI文件?
        • devise不当的清理应用程序删除他们不应该?
        • MSIdevise问题或msiexec.exe在最终产品注册期间安装结束时崩溃? 我发现这是不可能的,因为caching是在开始安装之前完成的,但是在开发MSI文件的时候我看到了这样的问题。
        • 突然停电 ? 由于Windows安装程序中的内置保护function也不太可能,但突然断电总是会导致意外的结果。
        • 防病毒软件或其他安全软件是否删除或阻止访问caching的MSI文件?
        • 如果你正在开发一个MSI并且保持testing重新安装,你可以通过在两个版本之间重复使用相同的软件包代码来触发这个问题(如果软件包代码是相同的,那么MSI根据定义将不同的MSI文件视为同一个文件) 。 这是一个非常特殊的情况,通常只在用于开发或质量保证的计算机上看到。
        • 用户或pipe理员手动删除caching文件夹中的MSI文件以保存或创build可用磁盘空间,或者只是修改Windows设置。 该文件夹是“超级隐藏”,难以访问,但仍然可以find它,并从中删除文件。
        • 当然还有更多可能的原因,但名单已经变得太长和笨重了。
    • 也适用于其他types的失败卸载
    • 它也可以用来杀死任何MSI安装,但显然不可取。
    • 更多信息: 为什么MSI要求原始.msi文件继续进行卸载?
  • 这个更新的支持工具 (此工具现在也被弃用)可以在最近的Windows版本上尝试,如果你已经解散MSI包需要卸载。
  • 一些build议使用saschabeaumont链接到这里的工具: 卸载没有MSI文件 。 如果你尝试它,它确实有效,请一定让我们知道。
  • 如果您有权访问实际用于安装该产品的原始MSI,则可以使用此来运行卸载。 它必须是使用的确切MSI,而不仅仅是一个类似的。

13.使用系统还原 (“安装撤消” – 最后的手段恕我直言)

  • 严格来说,这不是一种“ 卸载 ”的方式,而是“ 撤销 ”最后一次安装或几次安装。
  • 通过还原点还原将系统恢复到以前的安装状态 (您可以在YouTube或类似网站上find此video演示)。
  • 请注意,该function可以完全禁用或部分禁用 – 可以针对整个机器永久禁用,也可以每次安装禁用。
  • 我看到了系统还原导致的新的,无法解决的安装问题,但通常情况下,它工作正常 。 显然不要使用该function的乐趣。 这是最后的手段,最好用于回滚刚刚安装的新驱动程序或设置,并发现可能导致即时问题( 蓝屏 ,重启,不稳定等)。
  • 你回去的时间越长,你将为自己创造更多的返工,风险就越高。 大多数系统只具有一些还原点,其中大部分只有一两个我相信。
  • 请注意,系统还原可能会影响必须重新应用的Windows更新 ,以及许多其他系统设置。 除了纯粹的烦恼之外,这也可能导致安全问题重新出现,您可能需要使用Microsoft Baseline Security Analyzer或类似工具在目标机器上运行特定的安全检查。
  • 由于我提到系统恢复,我想我应该提到最后一次正确的configurationfunction 。 此function与卸载或系统还原无关,但是这是最后一次启动configuration,可以运行或导致正在运行的系统。 如果在启动过程中蓝屏或暂停,它可以用来让您的系统再次运行。 这经常发生在驱动程序安装之后。

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

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

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

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

因此,input带.msi扩展名的文件名,确实运行了msiexec,MSI文件作为参数,并采用缺省操作install。 出于这个原因,卸载要求您使用卸载开关调用msiexec来取消它。

 wmic product get name 

刚刚得到的CMD卡住…几分钟后仍然闪烁

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

我会尝试下面的语法 – 它适用于我。

 msiexec /x filename.msi /q 

我假设你inputint file.msi到命令行时,Windows自动为你调用msiexec file.msi。 我假设这是因为当你inputpicture.png它带来了默认的图片浏览器。