在不使用msiexec的情况下从命令行卸载MSI文件

问题描述 投票:50回答:7

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

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

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

.net command-line installation windows-installer msiexec
7个回答
47
投票

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


142
投票

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

总之,您可以通过以下方式卸载:msiexec.exe,ARP,WMI,PowerShell,部署系统(如SCCM,VBScript / COM Automation,DTF)或隐藏的Windows缓存文件夹,以及下面介绍的其他一些选项。

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

“Babble,Babble - Over”:第1,2和3节是正常的卸载方法(因此推荐)。 Personally I use option 3 or 5 from section 3(两个选项都带有日志记录,但选项5也以静默方式运行)。如果你很忙,可以跳过所有的唠叨,然后选择其中一个 - 它将完成工作。


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


如果你认为MSI和Windows 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项目等机制作为bundle的一部分安装。这可以使卸载与下面的内容略有不同。这是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 Appletappwiz.cplWindows 10 Settings Interface =>相同操作的新shell
  • ARP: 开始→运行→appwiz.cpl→ENTER以打开添加/删除程序小程序(或单击控制面板中的添加/删除程序) 单击要删除的产品的“删除”
  • 设置界面(Windows 8/10): 在Windows 8/10中使用新的设置GUI Windows键+点击I => Apps & Features。选择进入和卸载。 以这种方式调用卸载时出现一些错误报告。如果看到,请在下方添加评论。 Try this answer as well 一般提示:尝试禁用防病毒软件并重试。

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

  • 您可以通过命令提示符(cmd.exe),批处理文件或甚至从可执行文件中卸载作为shell操作。
  • 您可以通过将产品GUID(如下所示查找此GUID)或原始MSI文件的路径(如果有)传递给msiexec.exe来完成此操作。
  • 对于下面的所有命令行,您可以添加/qn以使卸载以静默方式运行。这是从添加/删除applet触发时卸载的运行方式。 选项1:基本交互式卸载(访问原始MSI文件): msiexec.exe /x "c:\filename.msi" 选项2:通过产品GUID进行基本交互式卸载(无法访问原始MSI文件 - here is how to find the product 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:使用刷新的详细日志文件进行交互式卸载(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选项使卸载变慢,因为日志文件是连续写入而不是批量写入。这可确保在安装程序崩溃时不会丢失日志缓冲区。 换句话说,如果您的安装程序崩溃并且详细日志文件中没有有用的信息,请启用此选项。删除感叹号以关闭flush to log选项,卸载速度会快得多。您仍然可以获得详细的日志记录,但如上所述,某些日志缓冲区可能会丢失。 选项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,则用于卸载)。
  • 热门提示:如果为卸载创建日志文件,则可以通过searching for "value 3"查找日志中的问题。这对于详细文件特别有用,因为它们非常详细:-)。
  • 如何查找已安装的MSI的产品GUID? 有几种方法,我推荐的方法是使用Powershell:How can I find the product GUID of an installed MSI setup? 这里描述的其他几种方式(注册表,本地缓存文件夹等):Find GUID From MSI File
  • 有关从installsite.org进行日志记录的更多信息:How do I create a log file of my installation? - 对不同选项的详细概述以及InstallShield日志记录的详细信息。
  • Msiexec (command-line options) - 来自MSDN的msiexec.exe命令行概述。这是the Technet version

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

  • MSI剥离所有出租车(较旧的Windows版本)并缓存安装在%SystemRoot%\ Installer的超级隐藏系统文件夹中的每个MSI(您需要显示隐藏文件才能看到它)。
  • 注意:这个超级隐藏文件夹现在在Windows 7以后的处理方式不同了。 MSI files are now cached full-size。阅读链接的线程以获取更多详细信息 - 建议您阅读任何找到此答案的人并阅读危险的Windows设置。
  • 此处的所有MSI文件都将分配一个随机名称(十六进制格式),但您可以通过显示Windows资源管理器状态栏(查看 - >状态栏)然后选择一个MSI来获取有关每个MSI的信息。来自MSI的摘要流将显示在Windows资源管理器窗口的底部。或者正如Christopher Galpin指出的那样,打开Windows资源管理器中的“评论”列并选择MSI文件(see this article for how to do this)。
  • 一旦找到合适的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,而不仅仅是类似的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 ++代码片段,展示了如何通过调用Orca, 10.1.17134.12按产品代码卸载MsiConfigureProductEx function。要卸载其他产品,请将为prodcode指定的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
}

截至2018年9月,使用最新版本的Visual Studio 2017制作并测试了该片段:

  1. 从Visual C ++ => Windows桌面创建一个新的“Windows控制台应用程序”。
  2. 将上述代码复制并粘贴到主CPP文件中(替换其中的任何内容)。
  3. 应该是能够运行代码。也许设置一个断点,构建和运行。 请注意VS2017中默认模板的更改,以及可能导致的奇怪错误:There are too many errors for the IntelliSense engine to function correctly。 更新2018年9月:模板再次更改。我不再看到上述问题了。 代码中的MSDN链接列出了从msiexec.exe返回的可能错误消息。

31
投票

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

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

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


3
投票

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

因此,输入带有.msi扩展名的文件名实际上以MSI文件作为参数运行msiexec并采取默认操作install。因此,卸载要求您使用卸载开关调用msiexec以取消安装。


2
投票
wmic product get name

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

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


1
投票

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

msiexec /x filename.msi /q 

-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.