我正在尝试自动卸载使用 WiX 创建的软件包,以便在不重新配置整个操作系统的情况下更改已安装的软件堆栈和配置。最终我将使用 powershell 脚本来执行此操作,但目前我似乎无法让我的测试包与 cmd 交互卸载。
如果我运行:msiexec /x '{A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}'
msiexec /x A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8
我得到:
"安装包打不开,请确认安装包
存在并且您可以访问它,或联系应用程序供应商
验证这是一个有效的 Windows 安装程序包。”
如果我运行:msiexec /x {A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}
我得到:
“此操作仅对当前安装的产品有效”
我看过 windows installer guide , WiX documentation , msiexec 文档并使用 orca 自己检查了 .msi,但我还没有真正找到任何可以清楚地了解如何处理卸载的内容。是否需要 .msi 文件,如果不需要,那么为什么 Windows 安装程序在给定 GUID 时会认为它是必需的?
.msi 安装程序的 WiX 代码是:
<?xml version='1.0' encoding='windows-1252'?>
<Wix xmlns='htp://schemas.microsoft.com/wix/2006/wi' >
<!--DO NOT COPY / PASTE THE PRODUCT ID GUID BELOW TO YOUR OWN WIX SOURCE -->
<Product Id='A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8' Language='2057'
Manufacturer='COMPANYNAME IT-Operations'
Name='COMPANYNAMEServerListener' Version='1.0.0'
UpgradeCode='PUT-GUID-HERE'>
<Package Id='*' Manufacturer='COMPANYNAME IT-Operations' Compressed='yes' />
<Media Id='1' Cabinet='COMPANYNAMEServerListener.cab' EmbedCab='yes' />
<Directory Id='TARGETDIR' Name='SourceDir'>
<Directory Id='ProgramFilesFolder' Name='PFiles'>
<Directory Id='COMPANYNAME' Name='COMPANYNAME'>
<Directory Id='INSTALLDIR' Name='COMPANYNAMEServerListener'>
<Component Id='MainExecutable' Guid='*' >
<File Id='COMPANYNAMEServerListener.exe'
Source='COMPANYNAMEServerListener.exe' Vital='yes'
KeyPath='yes' />
<ServiceInstall
Id='COMPANYNAMEServerListenerInstall'
DisplayName='COMPANYNAMEServerListener'
Description='Accepts and discards TCP connections on port 28028 to indicate that this server is alive and ready to be controlled'
Name='COMPANYNAMEServerListener'
Account='NT AUTHORITY\LocalService'
ErrorControl='normal'
Start='auto'
Type='ownProcess'
Vital='yes'
>
<ServiceDependency Id='tcpip'/>
</ServiceInstall>
<ServiceControl Id="StartService" Start="install" Stop="both" Remove="uninstall" Name="COMPANYNAMEServerListener" Wait="yes" />
</Component>
</Directory>
</Directory>
</Directory>
</Directory>
<Feature Id='Complete' Level='1' >
<ComponentRef Id='MainExecutable' />
</Feature>
<CustomTable Id ="COMPANYNAMEMetadata">
<Column Id="Property" Type="string" Category="Identifier" PrimaryKey="yes"/>
<Column Id="Value" Type="string"/>
<Row>
<Data Column="Property">InstallString</Data>
<Data Column="Value">/qn</Data>
</Row>
</CustomTable>
</Product>
</Wix>
最佳答案
"Reference-Style" Answer: This is an alternative answer to the one below with several different options shown. Uninstalling an MSI file from the command line without using msiexec.
您指定的命令是正确的: msiexec/x {A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}
如果您收到“此操作仅对当前安装的产品有效”,则您使用了无法识别的产品或包代码,您必须找到正确的。这通常是由于使用了错误的 造成的。包装代码 而不是 产品代码 卸载 - 每次重新构建 MSI 文件时,程序包代码都会更改,并且是您在查看 msi 文件的属性页时看到的唯一 guid。它应该适用于卸载,只要您使用正确的。没有出错的余地。如果您想查找产品代码,则需要打开 MSI。产品代码可在属性表中找到。
更新,2018 年 1 月 :
随着所有注册表重定向的进行,我不确定以下基于注册表的方法是否可行。我没有正确检查,因为我现在使用 PowerShell 依赖以下方法:How can I find the product GUID of an installed MSI setup?
还要检查这个引用风格的答案,描述卸载 MSI 包的不同方法以及确定您安装的产品版本的方法:
Uninstalling an MSI file from the command line without using msiexec
旧版,注册表选项 :
您也可以查找产品代码 通过阅读 注册表 从这个基本键:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall .按 F3 并搜索您的产品名称。 (如果它是 64 位机器上的 32 位安装程序,它可能位于 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall 下)。
旧版,PowerShell 选项 :(与上面的新链接答案非常相似)
最后,您可以使用 PowerShell 找到产品代码:
get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name
类似帖子:WiX - Doing a major upgrade on a multi instance install (如何在 MSI 中查找产品代码的屏幕截图)。
关于wix - 如何在不存在 .msi 文件的情况下使用产品 id guid 使用 msiexec 进行卸载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21491631/