假设您有一个名为programVersion
的变量。我们使用这个变量在注册表中发布应用程序的版本。
我们有一些条件可以检查机器上是否安装了另一个程序的特定版本,检查此注册表值:
<Property Id="ANOTHER_APP_INSTALLED">
<RegistrySearch Id="AnotherAppInstalled" Root="HKLM"
Key="$(var.keyPathProgram)$(var.AnotherProgramVersion)"
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>
<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 ]]>
RECAP:
因此,我在我的机器上安装了一个程序,检查是否在任何版本中安装了另一个应用程序,而不是我自己的应用程序。我需要它来检查其他应用程序是否安装在其任何可能的版本中。
编辑:我需要嘲笑v1,v1.1,v1.2,V1.3.已经安装了。但我需要允许它们都成为一个可能的安装版本,而不仅仅是其中的一个。我需要检查产品的每一个版本。
我知道这不是WiX的常规行为,但我需要它这样做。
发布于 2013-06-27 08:42:44
更新
通常,应用程序将安装的版本放在所有版本(例如InstalledVersion
键)中常见的密钥中。一旦从这个键读取了值,就可以使用它来允许或不允许使用WIX条件安装应用程序。
<Condition Message="This setup requires OTHER software version 1 or higher.">
<![CDATA[OtherSoftwareVersionProperty >= "1"]]>
</Condition>
上述条件将允许您的软件安装在任何版本的其他软件是大于1。
或仅在找到特定版本时才允许安装:
<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>
但是,如果您的其他软件为所有版本创建了单独的键,那么您必须对每个版本使用单独的注册表搜索,然后按照上面的解释,在单一条件下使用它们。
在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-27 12:32:20
如果任何注册表搜索都是可以的,那么为什么不搜索到很少的上层,比如
有点像
<RegistrySearch Id="AnotherAppV11Installed" Root="HKLM"
Key="$(var.keyPathProgram)"
Name="Path"
Type="raw" />
或者您也可以使用FileSearch元素来检测其他程序的某些文件版本,并在存储库中使用如下
<![CDATA[ ANOTHER_APP_INSTALLED <10.0 ]]>
https://stackoverflow.com/questions/17338142
复制相似问题