首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何给WiX变量赋值?

如何给WiX变量赋值?
EN

Stack Overflow用户
提问于 2013-06-27 08:20:46
回答 2查看 1.2K关注 0票数 1

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

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

代码语言:javascript
运行
复制
<Property Id="ANOTHER_APP_INSTALLED">
  <RegistrySearch Id="AnotherAppInstalled" Root="HKLM"
                    Key="$(var.keyPathProgram)$(var.AnotherProgramVersion)"
                    Name="Path"
                    Type="raw" />
</Property>

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

代码语言:javascript
运行
复制
<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>

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

代码语言:javascript
运行
复制
<Property Id="ANOTHER_APP_INSTALLED">
  <RegistrySearch Id="AnotherAppInstalled" Root="HKLM"
                    Key="$(var.keyPathProgram)$(var.AnotherProgramVersion)*"
                    Name="Path"
                    Type="raw" />
</Property>

下面是我检查是否安装了这些设备的方法:

代码语言:javascript
运行
复制
<![CDATA[ ANOTHER_APP_INSTALLED or ANOTHER_APPV11_INSTALLED ]]>

RECAP:

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

编辑:我需要嘲笑v1,v1.1,v1.2,V1.3.已经安装了。但我需要允许它们都成为一个可能的安装版本,而不仅仅是其中的一个。我需要检查产品的每一个版本。

我知道这不是WiX的常规行为,但我需要它这样做。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-27 08:42:44

更新

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

代码语言:javascript
运行
复制
<Condition Message="This setup requires OTHER software version 1 or higher.">
  <![CDATA[OtherSoftwareVersionProperty >= "1"]]>
</Condition>

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

或仅在找到特定版本时才允许安装:

代码语言:javascript
运行
复制
<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

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

代码语言:javascript
运行
复制
<MajorUpgrade AllowDowngrades="no" DowngradeErrorMessage="A newer version of [ProductName] is already installed." Disallow="yes" DisallowUpgradeErrorMessage="Please remove previous version of [ProductName]." />

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

票数 2
EN

Stack Overflow用户

发布于 2013-06-27 12:32:20

如果任何注册表搜索都是可以的,那么为什么不搜索到很少的上层,比如

有点像

代码语言:javascript
运行
复制
<RegistrySearch Id="AnotherAppV11Installed" Root="HKLM"
                    Key="$(var.keyPathProgram)"
                    Name="Path"
                    Type="raw" />

或者您也可以使用FileSearch元素来检测其他程序的某些文件版本,并在存储库中使用如下

代码语言:javascript
运行
复制
<![CDATA[ ANOTHER_APP_INSTALLED <10.0     ]]>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17338142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档