如何为WiX变量分配任何值?

时间:2013-06-27 08:20:46

标签: wix wix3.5 wix3.6

想象一下,你有一个名为programVersion的变量。我们使用此变量在注册表上发布我们在HKLM中的应用程序版本。

我们有一些条件来检查我们的机器上是否安装了特定版本 OF ANOTHER PROGRAM 来检查此注册表值:

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

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

<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,我需要ckeck。但我需要允许它们都是可能的安装版本,而不仅仅是其中之一。我需要检查产品的每个版本。

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

2 个答案:

答案 0 :(得分: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上还有一个很好的tutorial

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

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

确保在UpgradeCode元素中添加Product属性。

答案 1 :(得分:1)

如果任何注册表搜索都没问题,那么为什么不搜索直到像

这样的上层

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

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

<![CDATA[ ANOTHER_APP_INSTALLED <10.0     ]]>