想象一下,你有一个名为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的常规行为,但我需要它表现得那样。
答案 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 ]]>