msiexec
是安装MSI程序的命令提示符软件。但是我发现您可以通过在命令行中输入 MSI 文件的名称来从命令行安装 MSI 文件。
但是为了卸载 MSI 文件,您似乎必须调用该msiexec
程序并给它一个/x
or /uninstall
。
msiexec
如何在不使用例程的情况下从命令行卸载 MSI ?
msiexec
是安装MSI程序的命令提示符软件。但是我发现您可以通过在命令行中输入 MSI 文件的名称来从命令行安装 MSI 文件。
但是为了卸载 MSI 文件,您似乎必须调用该msiexec
程序并给它一个/x
or /uninstall
。
msiexec
如何在不使用例程的情况下从命令行卸载 MSI ?
快递选项:
按产品 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.exe、ARP、WMI、PowerShell、部署系统,例如SCCM、VBScript /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 卸载。
如果您认为MSI和Windows 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 节,了解使用系统还原和/或清理工具“撤消”安装的潜在方法。
Using the original MSI
Using the old ARP Applet OR new Windows 8/10 Settings Interface
只是提到了正常的方法,虽然很明显
ARP
= Add / Remove Programs Applet
( appwiz.cpl
)
Windows 10 Settings Interface
=> 相同操作的新外壳
ARP:
设置界面(Windows 8 / 10):
Apps & Features
。选择进入并卸载。ms-settings:appsfeatures
然后按EnterUsing msiexec.exe command line (directly or via a batch file)
/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 设置的产品 GUID?(如果您没有要在卸载命令中指定的原始 MSI,则用于卸载)。
重要提示:如果您为卸载创建日志文件,您可以通过搜索“值 3”在日志中找到问题。这对于详细文件特别有用,因为它们非常详细:-)。
如何找到已安装 MSI 的产品 GUID?
有关从installsite.org进行日志记录的更多信息:如何创建我的安装日志文件?- 不同选项的伟大概述以及 InstallShield 日志记录的细节。
Msiexec(命令行选项) -来自MSDN的msiexec.exe命令行概述。这是Technet 版本。
Using the cached MSI database in the super hidden cache folder
get-wmiobject Win32_Product | Format-Table Name, LocalPackage -AutoSize
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 卸载应用程序?
Using the .NET DTF Class Library
(WiX 工具包的一部分) using Microsoft.Deployment.WindowsInstaller;
public static void Uninstall( string productCode)
{
Installer.ConfigureProduct(productCode, 0, InstallState.Absent, "REBOOT=\"R\"");
}
Using the
Windows Installer Automation API
以下是对此选项的社区讨论:Windows Installer Automation API community sample
API 可以通过脚本自动化和 C++ API 调用来访问(我在 serverfault.com 上的帖子)
以下来源改编自 MSI 专家Christopher Painter使用VBScript:
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
Using a
Windows Installer major upgrade
Using Deployment Systems / Remote Administration Systems
Using WMI - Windows Management Instrumentation
Win32_Product.Install
Win32_Product.Uninstall
Using a third-party tool such as
ccleaner
or similar
Using a cleanup tool such as
msizap
or similar
Using
system restore
("installation undo" - last resort IMHO)
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 设置的产品 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
}
截至 2018 年 9 月,该代码段是使用最新版本的Visual Studio 2017制作和测试的:
从 Visual C++ => Windows 桌面创建一个新的“Windows 控制台应用程序”。
将上述代码复制并粘贴到您的主 CPP 文件中(替换其中的任何内容)。
那应该是它能够运行代码。也许设置一个断点,构建并运行。
简短的回答:你不能。使用 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 文件时实际使用的命令行。
另请记住,可以使用 WMIC 命令启动卸载:
wmic product get name
--> 这将列出所有已安装应用程序的名称
wmic product where name='myappsname' call uninstall
--> 这将卸载应用程序。
msi
文件扩展名映射到 msiexec(与在命令提示符下键入 .txt 文件名的方式相同,会启动记事本/默认文件.txt
处理程序以显示文件)。
因此,输入带有 .msi 扩展名的文件名确实会以 MSI 文件作为参数运行 msiexec,并采用默认操作 install。出于这个原因,卸载需要您调用带有卸载开关的 msiexec 来卸载它。
我会尝试以下语法 - 它适用于我。
msiexec /x filename.msi /q
wmic product get name
只是让cmd卡住了......几分钟后仍然闪烁_
在 中HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
,如果您可以找到具有您要安装的软件名称的文件夹(不是以 ProductCode 命名的文件夹),则 UninstallString 指向应用程序自己的卸载程序C:\Program Files\Zune\ZuneSetup.exe /x
我假设当您在命令行中键入 int file.msi 时,Windows 会自动为您调用 msiexec file.msi。我假设这是因为当您输入 picture.png 时,它会显示默认的图片查看器。