0

我正在尝试将安装程序配置为仅在安装某些版本的 3rd 方应用程序时有条件地安装某些组件。

<EDIT>
应该注意的是,第 3 方软件版本与我们的版本之间存在 1:1 的对应关系。第 3 方软件的此类版本是否有几十个(加上每个月最多三个额外版本),所以我们这样做不想进行手动编辑。我们的程序是针对第 3 方软件的所有版本自动构建的,但安装哪些文件需要有条件地进行。
<\编辑>

我只是将它部署为单个 .MSI,所以没有 Bootstrapper 等。从我的阅读和谷歌搜索来看,我相信我需要有一个 UPGRADE 部分,以确定应用程序当前将具有什么 PRODUCTCODE(多个版本.. 所以有是多个 PRODUCTCODEs 可能的)。然后可以使用此 PRODUCTCODE 从注册表中读取 DisplayVersion。

所以我有:

<Upgrade Id="{6D991503-3102-437E-B21D-471599D491AB}">
    <UpgradeVersion Minimum="0.0.0.0" OnlyDetect="yes" Property="CLEARSCADADETECTED" />
</Upgrade>

对于升级部分,然后..

<Property Id="CLEARSCADA_VER" Secure="yes" Hidden="no" Value="6.78.6626.1">
    <RegistrySearch Id="ClearSCADAVersionSearch"
                    Root="HKLM"
                    Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\[CLEARSCADADETECTED]"
                    Name="DisplayVersion"
                    Type="raw"
                    Win64="yes" />
</Property>

对于 REGISTRYSEARCH。

似乎 PRODUCTCODE 查找正在工作,但是 Registrysearch 没有.. (我期待 AppSearch 之后有一个 PROPERTY CHANGE 条目)

FindRelatedProducts: Found application: {2ACE38B2-F142-4EFE-9AC7-B25514E4930E}
MSI (c) (F0:90) [23:17:39:598]: PROPERTY CHANGE: Adding CLEARSCADADETECTED property. Its value is '{2ACE38B2-F142-4EFE-9AC7-B25514E4930E}'.
Action ended 23:17:39: FindRelatedProducts. Return value 1.
...
AppSearch: Property: CLEARSCADA_VER, Signature: ClearSCADAVersionSearch
MSI (c) (F0:90) [23:17:39:629]: Note: 1: 2262 2: Signature 3: -2147287038 
Action ended 23:17:39: AppSearch. Return value 1.

我已经尝试硬编码注册表查找(即用 {2ACE38B2-F142-4EFE-9AC7-B25514E4930E} 的静态文本替换 [CLEARSCADADETECTED]),没有任何更改。 Regedit 显示注册表项存在 对于检查内容的任何其他建议将不胜感激。

<EDIT 2>
好的,令人困惑的是,如果我引用 Version DWORD 值(而不是 DisplayVersion 字符串值),那么它确实将其正确读取为 #105781730。RegistrySearch 是否可能不适用于字符串值?
<编辑 2>

<EDIT 3>
是的......它正在工作。而且我想它现在也已经工作了一段时间。当我输入 Value='6.78.6626.1' 时,我应该意识到,如果我正在测试它的版本已经是 '6.78.6626.1',那么它就不会表明属性更改。
<编辑 3>

贝文

4

2 回答 2

1

我没有使用实际的主要升级检测进行测试,但也许尝试删除Hidden似乎会从日志中删除 set 属性操作的属性。我最初也删除了该Value属性,但将其放回原处,现在将其设置为 0:

<Property Id="CLEARSCADA_VER" Secure="yes" Value="0">
 <RegistrySearch Id="ClearSCADAVersionSearch"
                 Root="HKLM"
                 Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\[CLEARSCADADETECTED]"
                 Name="DisplayVersion"
                 Type="raw"
                 Win64="yes" />
</Property>

我进行了快速测试,这对我有用。并且您正在使用 WiX 文件中的设置正确搜索注册表的 64 位部分(假设这确实是您要搜索的部分)。自从 PhilDW 回答以来,也许您已经更新了您的问题?


我还验证了注册表搜索区分大小写。我不记得是不是。

要检查搜索和属性值,您可以使用脚本自定义操作进行调试(这样就没有编译和麻烦)。

  • VBScript 可以很好地进行调试,但不应用于生产代码。
  • 我可以为显示属性值的 VBScript 自定义操作转储所需的 WiX 自定义操作元素,但如果您不想要它,我不想让这个答案比现在更冗长。

您确定一次只安装一个版本的 3rd 方应用程序吗?也许与供应商核对并保证他们将如何进行部署可以在以后为您避免突然出现的问题?对其他包行为的依赖可能是一颗定时炸弹——它是非常紧密的耦合,超出了您的控制。不要听起来太戏剧化,这可能很好。只是提一下。如果你问我,检查这是一项经理任务。

你正在做的事情有点整洁,但遗憾的是,我经常遇到逻辑随着时间的推移变得更加复杂,我最终不得不求助于自定义操作来处理各种边缘情况。希望您不必走那条路,因为您正在做正确的事情来避免自定义操作

于 2018-03-21T21:04:03.707 回答
0

不清楚您是否需要注册表搜索,因为您可以拥有多个 UpgradeVersion 元素,每个元素都有您想要的版本。因此,在搜索中无需担心多个 ProductCode 值。该文档在这里:

https://www.firegiant.com/wix/tutorial/upgrades-and-modularization/checking-for-oldies/

显示多个 UpgradeVersion 元素的示例。

话虽如此,最简单的事情是拥有一个 UpgradeVersion 来引用您关心的确切版本范围,如果找到该范围内的任何内容,这将设置您的属性。您只需将最小值和最大值设置为值。

您的注册表搜索屏幕截图似乎显示了可能是 64 位系统上的本机注册表。您的搜索未明确设置 Win64,可能正在搜索 32 位注册表。

于 2018-03-21T19:02:06.110 回答