1

假设您有一个名为programVersion. 我们使用此变量在注册表上发布我们在 HKLM 中的应用程序版本。

我们有一些条件来检查我们的机器上是否安装了特定版本的另一个程序,检查此注册表值:

<Property Id="ANOTHER_APP_INSTALLED">
  <RegistrySearch Id="AnotherAppInstalled" Root="HKLM"
                    Key="$(var.keyPathProgram)$(var.AnotherProgramVersion)"
                    Name="Path"
                    Type="raw" />
</Property>

但是现在我创建了 OTHER 程序的新版本,我想检查旧版本或新版本是否存在于我的 NEW 应用程序的注册表中。所以我需要像这样检查两个版本:

<Property Id="ANOTHER_APP_INSTALLED">
  <RegistrySearch Id="AnotherAppInstalled" Root="HKLM"
                    Key="$(var.keyPathProgram)$(var.AnotherProgramVersion)"
                    Name="Path"
                    Type="raw" />
</Property>
<Property Id="ANOTHER_APPV11_INSTALLED">
  <RegistrySearch Id="AnotherAppV11Installed" Root="HKLM"
                    Key="$(var.keyPathProgram)$(var.AnotherProgramVersion11)"
                    Name="Path"
                    Type="raw" />
</Property>

有没有办法在变量后面加上星号,它后面接受任何值?像这样的东西:

<Property Id="ANOTHER_APP_INSTALLED">
  <RegistrySearch Id="AnotherAppInstalled" Root="HKLM"
                    Key="$(var.keyPathProgram)$(var.AnotherProgramVersion)*"
                    Name="Path"
                    Type="raw" />
</Property>

这是我检查是否安装了它们的方法:

<![CDATA[ ANOTHER_APP_INSTALLED or ANOTHER_APPV11_INSTALLED ]]>

回顾:

所以我在我的机器上安装了一个程序,它检查是否在任何版本中安装了另一个应用程序,而不是我自己的应用程序。我需要它来检查其他应用程序是否安装在任何可能的版本中。

编辑:我需要检查是否安装了 v1、v1.1、v1.2、v1.3...。但我需要让它们都成为可能的安装版本,而不仅仅是其中一个。我需要检查产品存在的每个版本。

我知道这不是 WiX 的常规行为,但我需要它表现得像那样。

4

2 回答 2

2

更新

通常,应用程序将安装的版本放在所有版本通用的密钥中,例如InstalledVersion密钥。一旦您从该键中读取了值,您就可以使用它来允许或禁止使用 WIX 条件安装您的应用程序。

<Condition Message="This setup requires OTHER software version 1 or higher.">
  <![CDATA[OtherSoftwareVersionProperty >= "1"]]>
</Condition>

上述条件将允许您的软件安装任何大于 1 的 OTHER 软件版本。

或仅在找到特定版本时使用它来允许安装:

<Condition Message="This setup requires OTHER software version 1.1.1 or 1.1.2.">
  <![CDATA[OtherSoftwareVersionProperty = "1.1.1" OR OtherSoftwareVersionProperty = "1.1.2"]]>
</Condition>

但是,如果您的 OTHER 软件为其所有版本创建单独的键,那么您将不得不对它们中的每一个使用单独的注册表搜索,然后如上所述在单一条件下使用它们。


OP更新问题后,以下答案没有多大意义

如果您只想检查程序的版本并阻止或允许升级和降级,那么我认为您应该查看MajorUpgrade元素。还有一个很好的教程How To: Implement a Major Upgrade In Your Installer

如果您只想防止升级和降级,那么您可以使用

<MajorUpgrade AllowDowngrades="no" DowngradeErrorMessage="A newer version of [ProductName] is already installed." Disallow="yes" DisallowUpgradeErrorMessage="Please remove previous version of [ProductName]." />

确保向元素添加UpgradeCode属性。Product

于 2013-06-27T08:42:44.147 回答
1

如果任何注册表搜索都很好,那么为什么不搜索到像这样的小上层

就像是

<RegistrySearch Id="AnotherAppV11Installed" Root="HKLM"
                    Key="$(var.keyPathProgram)"
                    Name="Path"
                    Type="raw" />

或者您也可以使用 FileSearch 元素来检测您的另一个程序的某些文件版本,并在 Blocker 中使用,例如

<![CDATA[ ANOTHER_APP_INSTALLED <10.0     ]]>
于 2013-06-27T12:32:20.950 回答