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

2024-09-19 08:57:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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


Tags: 文件命令行程序名称键入软件情况例程
3条回答

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

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

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

Express Options:

Uninstall by Product GUID: (find product GUID) - section 3 below for logging. There is also: MSI logging in depth here:

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

Uninstall by MSI file:

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

Express Interactive:

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

卸载MSI软件包的方法有很多种。以下内容旨在作为“参考”:

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

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

"Babble, Babble - Over":Sections 1, 2 and 3 are the normal uninstall approaches (and hence recommended). Personally I use option 3 or 5 from section 3 (both options with logging, but option 5 runs silently as well). If you are very busy, skip all the babble and go for one of these - it will get the job done.


如果您在完全卸载时遇到问题,并且正在寻找不推荐的MsiZap.exe和/或Windows Installer清理实用程序(msicu2.exe),您可以尝试新的FixIt tool from Microsoftor the international page)。显然,可能也适用于其他安装问题

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


如果您认为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工具包)或InstallShield Suite项目等机制作为捆绑包的一部分安装。这会使卸载与下面看到的略有不同。这里是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.cpl

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

  • ARP

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

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

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"
  • 刷新到日志选项使卸载变慢,因为日志文件是连续写入的,而不是成批写入的。这样可以确保在安装程序崩溃时不会丢失日志缓冲区

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

选项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版本),并将安装在超级隐藏系统文件夹中的每个MSI缓存在%SystemRoot%\Installer(您需要显示隐藏文件才能看到它)
  • NB:在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资源管理器窗口的底部。Or正如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

Enter image description here


5-Using{a31}


6-Using the .NET DTF Class Library(部分the WiX toolkit

  • 此选项适用于进入部署和MSI的开发人员-作为“快速修复”,它并不实用。它要求您下载the WiX toolkit——一个用于创建从XML源文件编译的MSI文件的免费框架
  • 关于WiX及其“历史”的简短介绍:Windows Installer and the creation of WiX。和{a38}(优势和劣势——希望尽可能客观)
  • DTF(部署工具基础)作为WiX的一部分分发,如下所述:Is source-code for Deployment Tools Foundation available?
  • DTF本质上是Win32 Windows Installer API的.NET包装器。当通过自动化与Windows Installer一起工作时,它消除了对COM互操作的所有需要,它简直就是一个.NET jewel-也许是我见过的最容易使用的.NET库。强烈推荐-即使是在C#中培训学生也很好
  • 以下{a40}来自MSI专家{a41}使用C#和DTF。Microsoft.Deployment.WindowsInstaller是DTF程序集之一See the other assemblies explained here on serverfault.com
    using Microsoft.Deployment.WindowsInstaller;

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

7-Using the{a45}


8-Using a{a52}

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

9-Using Deployment Systems / Remote Administration Systems

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

10-Using WMI - Windows Management Instrumentation


11-Using a third-party tool such as{a63}{}

  • 一些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-一系列tweet-此Process Explorer工具连接到VirusTotal.com以交互方式检查所有正在运行的进程-您只需要几个配置步骤
    • 我应该注意到Process Explorer生成了一个文件签名检查,但没有启发式方法——据我所知(没有检查可疑操作,只是对标记文件使用60多个安全套件进行检查)。您需要一个常规的安全工具来进行交互式在线启发式保护
    • 值得一提的是,我认为一些安全软件几乎会造成比恶意软件更严重的误报问题。赎金时代著名的遗言
    • 这是一个足够大的离题——我只是不想看到人们下载恶意软件。至少进行virustotal.com检查
  • 像这样卸载应该可以。我认为当你尝试它们的“清理功能”时,这些工具会弄乱太多东西。小心使用。如果您只使用卸载功能,您应该可以

12-{}{}{}

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

13-Using{a75}{}

  • 严格来说,这不是一种“卸载”的方法,而是一种“撤消”上次安装或多次安装的方法
  • 通过还原点进行还原会使系统恢复到以前的安装状态(您可以在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++代码片段,它展示了如何使用对InstallShield Suite的调用,通过产品代码卸载^ {< CD33 > }。要卸载另一个产品,请将为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
}

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

    < L> > P>从Visual C++ +Gt中创建一个新的“Windows控制台应用程序”;Windows桌面

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

  2. 那应该能够运行代码。可能设置一个断点,构建并运行

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

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

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

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

相关问题 更多 >