Wix FindRelatedProducts找到了一个未安装的产品

问题描述 投票:1回答:4

在机器中测试了我的产品的许多安装/卸载后,我最终出现了一个我没有安装产品的情况,至少我在控制面板中看不到它,但是当我再次尝试安装时, 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

谢谢!

wix windows-installer wix3.7
4个回答
1
投票

简答:下面的答案可能过于复杂,只需卸载升级设置找到的内容,然后再尝试安装。

从命令提示符(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

2
投票

Windows Installer有关于注册表的注册。它提供了一个API来反省该注册。在这种情况下,你想要::MsiEnumRelatedProducts()。它将通过UpgradeCode为您提供所有相关产品。

然后您可以执行以下操作卸载这些产品:

msiexec /x {PRODUCT-CODE-GUID}

您应该发现{PRODUCT-CODE-GUID}与您编辑的{MY-GUID}相同。

注意:这与WiX工具集无关。是100%Windows Installer行为(又名:MSI)。


0
投票

FindRelatedProducts由Windows Installer而不是WiX执行。你断言行为不正确肯定是不正确的。你有一台脏机器,MSI有工件表明它已安装。你的其他机器很干净,没有。


0
投票

我能够确定机器上留下的注册表项是什么导致了我提到的错误。

它们位于以下位置:

 - 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非常有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.