从命令行卸载 MSI 文件而不使用 msiexec
-
19-08-2019 - |
题
msiexec
是命令提示符软件,安装 MSI 程序。但我发现您只需在命令行中输入 MSI 文件的名称即可从命令行安装 MSI 文件。
但为了卸载 MSI 文件,似乎你必须调用 msiexec
程序并给它一个 /x
或者 /uninstall
.
如何从命令行卸载 MSI,而不使用 msiexec
常规?
解决方案
简短的回答:你不能。使用MSIEXEC / X
龙答:当您运行MSI直接在命令行文件,所有发生的事情是,它运行MSIEXEC你。这种关联被存储在注册表中。你可以看到关联的列表(在Windows资源管理器)将工具/文件夹选项/文件类型。
例如,可以运行在命令行一个.DOC文件,写字板或WINWORD将其打开。
如果你下HKEY_CLASSES_ROOT\.msi
注册表看,你会看到.MSI文件与程序id“Msi.Package”相关联。如果您在HKEY_CLASSES_ROOT\Msi.Package\shell\Open\command
看,你会看到命令行视窗实际使用时,您在“运行”一个.MSI文件。
其他提示
卸载 MSI 软件包的方法有多种。这旨在作为“参考”。
总之 您可以通过以下方式卸载: 微星执行程序, ARP, WMI, 电源外壳, 、部署系统如 SCCM, VB脚本 / COM 自动化, 数据传输格式, ,或通过 隐藏的 Windows 缓存文件夹, ,以及下面介绍的一些其他选项。
前几段提供了重要的 MSI 花絮,然后是 14节 使用不同的方式卸载 MSI 文件。噗。
“喋喋不休,喋喋不休——结束”: 部分 1, 2 和 3 是 正常卸载方法 (因此推荐)。
Personally I use option 3 or 5 from section 3
(两种记录的选项,但选项5也默默运行)。如果你是 很忙, 跳过所有的喋喋不休,选择一个 就能完成工作。
如果你有 完全卸载时出现问题 并正在寻找已弃用的替代方案 MSIZap.exe 和/或 Windows Installer 清理实用程序 (MSICUU2.exe),你可以尝试新的 Microsoft 的 FixIt 工具 (或国际页面)。显然也可以解决其他安装问题。
如果你认为 MSI 和 Windows安装程序 麻烦多于其价值,您可能想阅读 使用 MSI 文件的企业优势.
安装脚本 MSI 设置通常包含在 安装程序.exe 文件. 。要了解有关用于卸载此类设置的参数的更多信息,请参阅以下链接: setup.exe pdf 参考表, Setup.exe 和 Update.exe 命令行参数.
一些 MSI 文件作为 捆绑 通过诸如 烧伤 (WiX 工具包)或 安装盾套件 项目。这可能会使卸载与下面看到的略有不同。这是 InstallShield Suite 项目示例.
请注意,运行卸载 默默 或者 交互地 可能会导致不同的结果(!). 。有关为什么会出现这种情况的相当长的描述,请阅读这篇文章: 从控制面板卸载与从 .msi 删除不同
如果您在尝试卸载时意外地被要求提供原始安装介质,请阅读以下答案: 为什么 MSI 需要原始 .msi 文件才能继续卸载? 也许还可以在下面的第 12 节中了解一些重要的技术细节。
如果你有 CC清理器 或安装类似的清理工具,也许跳转到 第11条.
如果卸载完全失败(无法运行),请参阅下面的第 12 和 13 节 寻找一种潜在的方法“撤消“安装使用 系统还原 和/或清理工具。
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 → 进入 为了打开添加/删除程序小程序(或单击控制面板中的添加/删除程序)
- 点击 ”消除“对于您要卸载的产品
设置界面 (Windows 8 / 10):
- 在 Windows 8 / 10 中使用新的设置 GUI
- Windows 键 + 点击 我 =>
Apps & Features
. 。选择条目并卸载。 - 以这种方式调用卸载时出现一些错误报告。如果看到请在下面添加评论。
- 也尝试一下这个答案
- 一般提示:尝试禁用防病毒软件并重试。
3. Using msiexec.exe command line (directly or via a batch file)
- 您可以通过卸载 命令提示符 (执行程序), 批处理文件 或者甚至从可执行文件中作为 外壳操作.
- 您可以通过传递 产品GUID (检查下面如何找到这个 GUID) 或原始 MSI 文件的路径(如果有) 微星执行程序.
对于下面的所有命令行,您可以添加
/qn
到 使卸载以静默模式运行. 。这就是从添加/删除小程序触发时卸载运行的方式。选项1:基本交互式卸载 (访问原始MSI文件):
msiexec.exe /x "c:\filename.msi"
选项2:通过产品 GUID 进行基本交互式卸载 (无法访问原始 MSI 文件 - 以下是如何查找产品 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"
刷新到日志选项使卸载速度变慢 因为日志文件是连续写入的,而不是批量写入的。这可以确保在安装崩溃时日志缓冲区不会丢失。
换句话说, 如果您的设置崩溃并且详细日志文件中没有有用的信息,请启用此选项. 。删除感叹号以关闭刷新到日志选项,卸载会更快。您仍然可以获得详细的日志记录,但如上所述,某些日志缓冲区可能会丢失。
选项 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
再次说明如何查找产品指南:如何找到已安装的 MSI 设置的产品 GUID? (如果您没有在卸载命令中指定的原始 MSI,则用于卸载)。
顶部提示:如果您为卸载创建日志文件,则可以通过以下方式在日志中查找问题 搜索“值 3”. 。这对于详细文件特别有用,因为它们非常详细:-)。
如何查找已安装 MSI 的产品 GUID?
- 有多种方法,我推荐的方法是使用Powershell: 如何找到已安装的 MSI 设置的产品 GUID?
- 这里描述了几种其他方式(注册表、本地缓存文件夹等): 从 MSI 文件中查找 GUID
有关登录的更多信息 安装站点.org: 如何创建安装日志文件? - 不同选项的精彩概述以及 InstallShield 日志记录的细节。
- Msiexec(命令行选项) - 命令行概述 微星执行程序 从 微软软件定义网络. 。这是 技术网版本.
4. Using the cached MSI database in the super hidden cache folder
- MSI 删除所有 cab(较旧的 Windows 版本)并将安装在超级隐藏系统文件夹中的每个 MSI 缓存在 %SystemRoot%\安装程序 (您需要显示隐藏文件才能看到它)。
- 注意:现在,从 Windows 7 开始,这个超级隐藏文件夹的处理方式有所不同。 MSI 文件现在以全尺寸缓存. 。阅读链接的线程以获取更多详细信息 - 建议任何找到此答案并摆弄危险 Windows 设置的人阅读。
- 此处的所有 MSI 文件都将分配一个随机名称(十六进制格式),但您可以通过显示 Windows 资源管理器状态栏(查看 -> 状态栏)然后选择 MSI 来获取有关每个 MSI 的信息。来自 MSI 的摘要流将显示在 Windows 资源管理器窗口的底部。或者正如 Christopher Galpin 指出的那样,打开 Windows 资源管理器中的“注释”列并选择 MSI 文件(请参阅这篇文章了解如何执行此操作).
- 找到正确的 MSI 后,只需右键单击它并转到“卸载”。
- 您还可以使用 PowerShell 显示本地缓存的包的完整路径以及产品名称。我认为这是最简单的选择。
- 点火 电源外壳: 按住 Windows 键,点击 R,松开 Windows 键,输入“powershell”,然后按“确定”. 。然后 最大化 PowerShell 窗口 并运行以下命令:
get-wmiobject Win32_Product | Format-Table Name, LocalPackage -AutoSize
- 另请参阅这个答案: 如何找到已安装的 MSI 设置的产品 GUID?
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 Library
(部分 WiX 工具包)
- 此选项供开发人员进入部署和 MSI - 作为“快速解决方案”,它并不真正实用。它需要你下载 WiX 工具包 - 用于创建从 XML 源文件编译的 MSI 文件的免费框架。
- 关于 WiX 及其“历史”的快速简介: Windows Installer 和 WiX 的创建. 。和 这是 WiX 与其他部署工具的对比(商业) -(优点和缺点 - 希望尽可能客观)。
- 数据传输格式 (部署工具基金会)作为 WiX 的一部分进行分发,如下所述: 部署工具基础的源代码是否可用?.
- DTF本质上是一个 Win32 Windows Installer API 的 .NET 包装器. 。通过自动化使用 Windows Installer 时,它消除了对 COM Interop 的所有需要,并且完全是一个 .NET 宝石 - 也许是我见过的最容易使用的 .NET 库。强烈推荐 - 即使对于 C# 培训学生来说也很棒.
- 下列 来源 来自MSI专家 克里斯托弗·佩因特 使用 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\"");
}
7. Using the
Windows Installer Automation API
- 以下是对此选项的社区讨论: Windows Installer 自动化 API 社区示例
- 该 API 可以通过以下方式访问 脚本自动化和 C++ API 调用 (我在 serverfault.com 上的帖子)
以下来源改编自MSI专家 克里斯托弗·佩因特 使用 VB脚本:
Set installer = CreateObject("WindowsInstaller.Installer") installer.InstallProduct "product.msi", "REMOVE=ALL REBOOT=ReallySuppress" Set installer = Nothing
这是 Symantec 的另一个用于通过 GUID 卸载的 VBScript: http://www.symantec.com/connect/downloads/uninstall-application-using-guid-registry
8. Using a
Windows Installer major upgrade
- Windows Installer 主要升级可能作为另一个 MSI 文件安装的一部分进行。
- 通过识别 MSI 中的相关产品来进行重大升级”升级表”。然后按照表中的指定处理这些相关设置。通常,这意味着它们已被卸载,但也可以中止主安装(通常用于检测包装盒上存在的您自己的应用程序的更高版本)。
9. Using Deployment Systems / Remote Administration Systems
- SCCM, 加州Unicenter, IBM 的蒂沃利, 阿尔蒂里斯 客户管理套件和其他几个
- 这些工具具有高级客户端 PC 管理功能,其中包括 MSI 文件的安装和卸载
- 这些工具似乎结合使用了 msiexec.exe、自动化、 WMI, , ETC...甚至他们自己的调用安装和卸载的方式。
- 根据我的经验,这些工具具有很多“个性”,您需要适应它们不同的做事方式。
10. Using WMI - Windows Management Instrumentation
- 添加只是为了完整性。这是 不建议 使用这种方法,因为它是 非常慢
- A 软件一致性检查 每次都会触发 Win32_产品 每次安装都会被调用
- 一致性检查是 慢得令人难以置信, ,和它 也可能会触发软件修复. 。参见这篇文章: Powershell卸载脚本——真让人头疼
- 更糟糕, 有些人报告他们的事件日志充满了 MsiInstaller EventID 1035 条目 - 显然是由对 Win32_Product 类的 WMI 查询引起的(我个人从未见过这种情况)。
- 这 WMICodeCreator.exe 可以使用代码创建工具进行实验
- 可以通过调用安装
Win32_Product.Install
- 可以通过调用卸载
Win32_Product.Uninstall
- 可以通过调用安装
- MSDN 示例: Win32_Product类的卸载方法
11. Using a third-party tool such as
ccleaner
or similar
- 一些 Windows 应用程序具有自己的界面,不仅可以卸载 MSI 软件包,还可以卸载旧版安装程序。
- 我不想在这里提出任何具体的工具推荐(尤其是商业工具),但是众所周知的 CC清理器 具有这样的卸载界面(并且它有免费版本)。我还应该补充一点 该工具最近遭受了恶意软件攻击.
- 我想我们都应该记住,即使是无害的软件也可能在其下载位置注入恶意软件(FTP 攻击)。
- 我用 virustotal.com 检查我的下载,以及 Sysinternals 进程浏览器 安装后检查正在运行的进程 - 以及常规安全软件(以可用者为准)。
- 通过这种方法通常会发现数量惊人的“灰色区域”软件(工具栏、表情符号、广告软件等),以及一些误报(它们也可能导致问题,因为安全软件会阻止其访问或隔离它们,从而导致很多毛茸茸的)。当然还有真正的恶意软件。
- Process Explorer 的一些使用技巧可以在这里找到 - 一系列推文 - 这个 Process Explorer 工具连接到 VirusTotal.com 以交互方式检查所有正在运行的进程 - 您所需要的只是一些配置步骤。
- 我应该注意到,Process Explorer 会进行文件签名检查,但不会进行启发式检查 - 据我所知(不会检查可疑操作,只是检查 60 多个标记文件的安全套件)。您需要一个常规安全工具来进行交互式在线启发式保护。
- 无论如何,我认为某些安全软件造成的误报问题比恶意软件造成的损害还要多。勒索软件时代著名的遗言......
- 这是一个足够大的题外话——我只是不想看到人们下载恶意软件。做你的 virustotal.com 至少检查一下。
- 像这样卸载应该可以正常工作。我认为当你尝试这些工具的“清理功能”时,它们会弄乱太多的东西。谨慎使用。如果您只使用卸载功能,应该没问题。
12. Using a cleanup tool such as
msizap
or similar
msizap
- 为了完整性
msizap.exe应该提到的是 已弃用, 不支持的 和 过时的. 。它不应该在任何较新的 Windows 版本上使用 - 这个命令行工具(
msizap.exe)还有一个可用的 GUI(MSICUU2.exe)。这两种工具均已弃用。 - 这些工具的预期用途是 清除失败的卸载:
- 通常对于罕见的情况 带有随机名称的缓存 MSI 被错误地丢失 由于这个原因,在要求原始 MSI 时卸载失败。这是一个罕见的问题,但我自己也见过。只是一些潜在的原因: 转移到这个答案.
- 关键词:系统恢复干扰、不良清理应用程序、msiexec.exe 崩溃、断电、安全软件干扰、MSI 开发调试错误(相同的包代码等...)、用户修补和黑客攻击(这里有什么?节省空间?)等...
- 它也可以用来破坏任何 MSI 安装,尽管这显然是不可取的。
- 更多信息: 为什么 MSI 需要原始 .msi 文件才能继续卸载?
这个较新的支持工具(此工具现在也已弃用)如果您有需要卸载的失效 MSI 软件包,可以在最新的 Windows 版本上尝试。- 有些人建议使用 saschabeaumont 链接到此处的工具: 无需 MSI 文件即可卸载. 。如果您尝试过并且有效,请务必告诉我们。
- 如果您有权访问实际用于安装产品的原始 MSI,则可以使用它来运行卸载。它必须是所使用的确切 MSI,而不仅仅是类似的 MSI。
13. Using
system restore
("installation undo" - last resort IMHO)
- 严格来说,这不是“卸载“但是到”撤消“最后一次安装,或多次安装。
- 通过还原点还原使系统恢复到原来的状态 之前的安装状态 (您可以在 YouTube 或类似网站上找到此视频演示)。
- 请注意,该功能可以完全或部分禁用 - 可以对整台计算机永久禁用,也可以在每次安装时临时禁用。
- 我遇到过因系统还原而导致的新的、无法解决的安装问题,但通常可以正常工作. 。显然,不要使用该功能来娱乐。这是最后的手段,最适合用于 回滚新驱动程序 或刚刚安装并被发现会立即导致问题的设置(蓝屏幕, 、重新启动、不稳定等...)。
- 你回去的时间越长,你给自己带来的返工就越多,风险也就越高。大多数系统仅具有几个恢复点,而且我相信其中大多数只能回溯一两个月。
- 请注意,系统还原可能会影响 Windows 更新 然后必须重新应用该设置以及许多其他系统设置。除了纯粹的烦恼之外,这还可能导致安全问题重新出现,您可能需要使用以下命令对目标框运行特定的安全检查 微软基线安全分析器 或类似的工具。
- 既然我提到了系统恢复,我想我应该提到 最后一次的正确配置功能. 。此功能与卸载或系统还原无关,但它是最后一次有效或导致系统运行的启动配置。如果系统在启动过程中蓝屏或停止,它可用于使系统重新运行。这通常发生在驱动程序安装后。
14. Windows Installer Functions (C++)
为了完整起见,我想我们应该提到这一切的核心 - 脚踏实地的方式: Win32 Windows Installer API 函数. 。这些可能是大多数(如果不是所有)上面列出的“幕后”其他方法使用的功能。它们主要由直接将 MSI 作为技术处理的应用程序或解决方案使用。
serverfault.com 上有一个答案,您可能会感兴趣 不同编程卸载方法的总结 (COM 自动化、.NET、Win32 安装程序功能)。
下面您将找到一个显示如何卸载的 C++ 代码片段 Orca, 10.1.17134.12
通过产品代码使用调用 MsiConfigureProductEx 函数. 。要卸载其他产品,请替换指定的 GUID prodcode
与您的产品相匹配的产品。要查找产品代码,请参阅此答案: 如何找到已安装的 MSI 设置的产品 GUID?
卸载将以完整 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
}
该片段是使用最新版本制作并测试的 视觉工作室 2017 截至 2018 年 9 月:
- 从 Visual C++ => Windows 桌面创建一个新的“Windows 控制台应用程序”。
- 将上述代码复制并粘贴到主 CPP 文件中(替换其中的任何内容)。
这样就可以运行代码了。也许设置一个断点,构建并运行。
请注意 VS2017 中默认模板的更改,以及可能导致的奇怪错误: IntelliSense 引擎存在太多错误,无法正常运行.- 2018 年 9 月更新:模板又变了。我不再看到上述问题。
- 代码中的 MSDN 链接列出了从 msiexec.exe 返回的可能错误消息。
还记得的卸载可以使用WMIC命令来启动:
wmic product get name
- >这将列出所有已安装的应用程序的名称
wmic product where name='myappsname' call uninstall
- >这将卸载的应用
在msi
文件扩展名被映射到MSIEXEC(相同的方式上的命令提示输入一个.txt文件名启动记事本/默认.txt
文件处理程序,以显示文件)。
因此,在一个文件名与.msi扩展名键入真正运行与MSI文件作为参数MSIEXEC并采取默认动作,安装。出于这个原因,卸载需要你调用MSIEXEC与卸载开关到解除停止它。
wmic product get name
就卡住了CMD ......仍然闪烁_几分钟后
在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
,如果你能找到你要安装(而不是一个与产品代码命名)软件名称的文件夹中,UninstallString点到应用程序本身的卸载程序C:\Program Files\Zune\ZuneSetup.exe /x
我想尝试下面的语法 - 它为我的作品
msiexec /x filename.msi /q
我假设当你int类型文件.msi进入命令行模式时,Windows会自动要求你MSIEXEC文件.msi。我假设这是因为,当你在picture.png键入它带来了默认的图片浏览器。