Wix FindRelatedProducts找到了一个未安装的产品
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Wix FindRelatedProducts找到了一个未安装的产品相关的知识,希望对你有一定的参考价值。
在机器中测试了我的产品的许多安装/卸载后,我最终出现了一个我没有安装产品的情况,至少我在控制面板中看不到它,但是当我再次尝试安装时, Wix正在尝试更新未安装的产品。
我用日志执行了msi,然后我发现FindRelatedProducts
被找到一个GUID并填充了WIX属性WIX_UPGRADE_DETECTED
。
日志的一部分:
FindRelatedProducts: Found application: {MY-GUID}
MSI (c) (24:8C) [07:21:36:885]: PROPERTY CHANGE: Adding WIX_UPGRADE_DETECTED property. Its value is '{MY-GUID}'.
当我使用WIX_UPGRADE_DETECTED
选择对话框(安装或升级)来显示时,它显示一个升级对话框,但没有安装任何产品。
如果我在另一台机器上测试,做同样的情况,FindRelatedProducts
找不到任何产品,这是正确的情况。
我怀疑Windows注册表中的一些条目(regedit)没有清理。你知道Wix如何检测FindRelatedProducts
吗?或者为什么Wix在没有安装产品的情况下填充WIX_UPGRADE_DETECTED
?
谢谢!
简答:下面的答案可能过于复杂,只需卸载升级设置找到的内容,然后再尝试安装。
从命令提示符(Windows Key + Tap R + Type:
cmd.exe
+ Enter)运行以下命令:msiexec.exe /x {GUID-FROM-LOG-FILE}
GUID(很可能)是您日志文件中的一个:
WIX_UPGRADE_DETECTED
。然后再次尝试安装。卸载失败:如果卸载失败,请尝试运行此Microsoft FixIt tool。有时它可以整理不能正确卸载的设置。 Alternative, under the hood fix(不推荐)。
UpgradeTable:我要做的第一件事是验证编译的MSI文件中UpgradeTable
中显示问题的内容。那里的升级代码是否与您的设置的升级代码相匹配? (UpgradeCode entry
中的Property Table
)。
UpgradeTable
的内容确定检测到与新安装相关的现有安装(如果有)。如果你在这里配置奇怪的东西,你甚至可能最终卸载错误地检测到与你的相关的竞争产品 - 我不会尝试:-)。文书工作太多了。
卸载:现在,如何摆脱安装问题?您需要掌握ProductCode GUID。有许多方法可以获取此信息。它应该是您在WIX_UPGRADE_DETECTED
的MSI日志中看到的产品GUID,因此请先尝试:
msiexec.exe /x {GUID}
以下是一般意义上卸载MSI设置的答案(各种不同的选项 - 快速阅读?):Uninstalling an MSI file from the command line without using msiexec。
ProductCode(GUID):Rob已经提到了正确的MSI API来列出已安装的产品,我只想补充说我在这里有这个答案可以提供帮助:How can I find the product GUID of an installed MSI setup?它列出了几个选项来查看你的盒子上安装了什么。
VBScript / COM自动化:我将从上面的第一个链接内联VBScript选项(该链接答案中列出了几个选项):
' Retrieve all ProductCodes (with ProductName and ProductVersion)
Set fso = CreateObject("Scripting.FileSystemObject")
Set output = fso.CreateTextFile("msiinfo.csv", True, True)
Set installer = CreateObject("WindowsInstaller.Installer")
On Error Resume Next ' we ignore all errors
For Each product In installer.ProductsEx("", "", 7)
productcode = product.ProductCode
name = product.InstallProperty("ProductName")
version=product.InstallProperty("VersionString")
output.writeline (productcode & ", " & name & ", " & version)
Next
output.Close
PowerShell:也可以使用PowerShell选项。在某些情况下,这可能会引发意外的自我修复。
get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize
Windows Installer有关于注册表的注册。它提供了一个API来反省该注册。在这种情况下,你想要::MsiEnumRelatedProducts()。它将通过UpgradeCode
为您提供所有相关产品。
然后您可以执行以下操作卸载这些产品:
msiexec /x {PRODUCT-CODE-GUID}
您应该发现{PRODUCT-CODE-GUID}
与您编辑的{MY-GUID}
相同。
注意:这与WiX工具集无关。是100%Windows Installer行为(又名:MSI)。
FindRelatedProducts由Windows Installer而不是WiX执行。你断言行为不正确肯定是不正确的。你有一台脏机器,MSI有工件表明它已安装。你的其他机器很干净,没有。
我能够确定机器上留下的注册表项是什么导致了我提到的错误。
它们位于以下位置:
- HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\UpgradeCodes\{OTHER-GUID}
- HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Products\{OTHER-GUID}
请注意,{OTHER-GUID}不是我的产品代码,而是生成的代码,我的产品代码是这些注册表项中存在的值之一。
只需删除它们就可以让安装程序再次运行
Tks @ stein-Åsmul这个命令:get-wmiobject Win32_Product
非常有帮助。
以上是关于Wix FindRelatedProducts找到了一个未安装的产品的主要内容,如果未能解决你的问题,请参考以下文章
WIX 检测 .net 4.5 没有找到 PropertyRef NETFRAMEWORK45 集?
WiX 安装程序:使用 xslt 和 heat.exe 如何在找到父/子匹配后更改父 ID 的值?