Wix FindRelatedProducts找到了未安装的产品

时间:2019-04-22 16:43:56

标签: wix windows-installer wix3.7

在机器上测试了许多产品的安装/卸载后,我最终遇到了以下情况:我没有安装产品,至少在控制面板中看不到它,但是当我尝试安装时再次,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 Registry(regedit)中的某些条目未清除。 您知道Wix如何检测到FindRelatedProducts吗?还是为什么Wix在没有安装产品的情况下填充WIX_UPGRADE_DETECTED

谢谢!

4 个答案:

答案 0 :(得分:2)

Windows Installer的注册信息与注册表有关。它提供了一个用于对该注册进行自省的API。在这种情况下,您需要::MsiEnumRelatedProducts()。通过该UpgradeCode,您将获得所有相关产品。

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

msiexec /x {PRODUCT-CODE-GUID}

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

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

答案 1 :(得分:1)

  

简短答案 :以下答案可能过于详尽,只需卸载升级安装程序中找到的内容,然后尝试   再次安装。

     

在命令提示符下( Windows键 +点击 R +   输入: cmd.exe + Enter ),运行以下命令:

msiexec.exe /x {GUID-FROM-LOG-FILE}
     

GUID是(很可能是)日志文件中的GUID: WIX_UPGRADE_DETECTED 。然后尝试   再次安装。

     

卸载失败 :如果卸载失败,请尝试运行此Microsoft FixIt tool。有时,它可以清理出无法正确卸载的设置。 Alternative, under the hood fix(不推荐)。


UpgradeTable :我要做的第一件事是验证已编译的MSI文件中的 UpgradeTable 中的内容显示问题。那里的升级代码是否与您设置的升级代码匹配? ( UpgradeCode entry 中的 Property Table )。

UpgradeTable 的内容确定哪些现有安装(如果有)与新安装相关。如果您在此处配置奇怪的内容,您甚至可能最终卸载被错误检测为与您的产品相关的竞争产品-我不会尝试:-)。文书工作太多。


卸载 :现在,如何摆脱有问题的安装?您需要掌握ProductCode GUID。有很多方法可以获取此信息。 它应该是您在MSI日志中看到的WIX_UPGRADE_DETECTED产品GUID,因此请首先尝试:

msiexec.exe /x {GUID}

以下是从一般意义上卸载MSI设置的答案(各种不同的选项-快速阅读吗?):Uninstalling an MSI file from the command line without using msiexec


ProductCode(GUID) :Rob已经提到了正确的MSI API来列出已安装的产品,我只想补充一点,我在这里有此答案可以帮助您: {3}}它列出了几个选项来查看您的包装盒中安装了什么。

VBScript / COM Automation :我只是从上面的第一个链接内联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 :(得分:0)

FindRelatedProducts是由Windows Installer而不是WiX执行的。您断言该行为不正确的断言肯定是不正确的。您有一台肮脏的计算机,MSI上有表明已安装的工件。您的另一台机器是干净的,不是。

答案 3 :(得分:0)

我能够确定导致我提到的错误的计算机上留下了哪些注册表项。

它们在以下位置:

 - HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\UpgradeCodes\{OTHER-GUID}
 - HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Products\{OTHER-GUID}

请注意,{OTHER-GUID}不是我的产品代码,而是生成的代码,我的产品代码是这些注册表项中存在的值之一。

只需删除它们,即可使我的安装程序再次运行。

@ ks @stein-Åsmul这个命令:get-wmiobject Win32_Product非常有用。