如何比较burn (wix)中DetectCondition中的版本变量

2023-12-02

这是我的Fragment

<Fragment>
    <Variable Name="Hasp_BundleVersion" Value="7.54.8889.1" />
    <Variable Name="Hasp_IsInstalled" />
    <Variable Name="Hasp_InstalledVersion" />

    <util:RegistrySearch Id="Hasp_IsInstalled"
                         Variable="Hasp_IsInstalled"
                         Root="HKLM"
                         Key="SOFTWARE\Aladdin Knowledge Systems\HASP\Driver\Installer"
                         Value="Version"
                         Result="exists" />

    <util:RegistrySearch Condition="Hasp_IsInstalled"
                         After="Hasp_IsInstalled"
                         Variable="Hasp_InstalledVersion"
                         Root="HKLM"
                         Key="SOFTWARE\Aladdin Knowledge Systems\HASP\Driver\Installer"
                         Value="Version"
                         Result="value" />

    <PackageGroup Id="Hasp">
        <ExePackage Id="Hasp"
                    DisplayName="Hasp"
                    SourceFile="setups\HASPUserSetup.exe"
                    Compressed="yes"
                    DetectCondition="Hasp_IsInstalled AND Hasp_InstalledVersion &gt;= Hasp_BundleVersion"
                    InstallCommand="/s /v/qn"
                    PerMachine="yes"
                    Permanent="yes" />
    </PackageGroup>
</Fragment>

这是行不通的,因为它看起来像是将两个值作为字符串进行比较。这是日志:

[0A74:0A4C][2017-03-29T16:29:02]i000: Initializing string variable 'Hasp_BundleVersion' to value '7.54.8889.1'
[0A74:0A4C][2017-03-29T16:29:02]i000: Setting numeric variable 'Hasp_IsInstalled' to value 1
[0A74:0A4C][2017-03-29T16:29:02]i000: Setting string variable 'Hasp_InstalledVersion' to value '7.54.66980.1'
[0A74:0A4C][2017-03-29T16:29:02]i052: Condition 'Hasp_IsInstalled AND Hasp_InstalledVersion >= Hasp_BundleVersion' evaluates to false.

如果我更改为输入Version,它也不起作用:

<Fragment>
    <Variable Name="Hasp_BundleVersion" Type="version" Value="7.54.8889.1" />
    <Variable Name="Hasp_IsInstalled" />
    <Variable Name="Hasp_InstalledVersion" Type="version" Value="0.0.0.0" />

    <util:RegistrySearch Id="Hasp_IsInstalled"
                         Variable="Hasp_IsInstalled"
                         Root="HKLM"
                         Key="SOFTWARE\Aladdin Knowledge Systems\HASP\Driver\Installer"
                         Value="Version"
                         Result="exists" />

    <util:RegistrySearch Condition="Hasp_IsInstalled"
                         After="Hasp_IsInstalled"
                         Variable="Hasp_InstalledVersion"
                         Root="HKLM"
                         Key="SOFTWARE\Aladdin Knowledge Systems\HASP\Driver\Installer"
                         Value="Version"
                         Result="value" />

    <PackageGroup Id="Hasp">
        <ExePackage Id="Hasp"
                    DisplayName="Hasp"
                    SourceFile="setups\HASPUserSetup.exe"
                    Compressed="yes"
                    DetectCondition="Hasp_IsInstalled AND Hasp_InstalledVersion &gt;= Hasp_BundleVersion"
                    InstallCommand="/s /v/qn"
                    PerMachine="yes"
                    Permanent="yes" />
    </PackageGroup>
</Fragment>

Log:

[1B40:0CEC][2017-03-29T16:42:23]i000: Initializing version variable 'Hasp_BundleVersion' to value '7.54.8889.1'
[1B40:0CEC][2017-03-29T16:42:23]i000: Initializing version variable 'Hasp_InstalledVersion' to value '0.0.0.0'
[1B40:0CEC][2017-03-29T16:42:23]i000: Setting numeric variable 'Hasp_IsInstalled' to value 1
[1B40:0CEC][2017-03-29T16:42:23]i000: Setting string variable 'Hasp_InstalledVersion' to value '7.54.66980.1'
[1B40:0CEC][2017-03-29T16:42:23]i052: Condition 'Hasp_IsInstalled AND Hasp_InstalledVersion >= Hasp_BundleVersion' evaluates to false.

我在用着Variables,因为我需要稍后在自定义引导程序中访问这些值。

我究竟做错了什么?


水平线下方是我最初的回应,我认为这是错误的。 您可以像 roli09 那样定义版本变量,即:

<Variable Name="Hasp_BundleVersion" Type="version" Value="7.54.8889.1" />

而且你不需要“v”。如果您执行如下条件,则确实需要 v:

Condition="InstalledVersion &gt;= v7.0.2.1"

以便编译器将第二个操作数作为版本进行处理。

我认为这里发生的事情是在第一个代码片段中,我们将两个版本都视为字符串变量。作为字符串,它们会逐个字符进行比较,并且 '6'

在第二个代码片段中,我相信我们最终得到两个 Hasp_InstalledVersion 变量。捆绑包中定义的变量是“版本”变量,而 RegistySearch 定义的变量是字符串变量。我猜测在这种情况下它会比较两个版本变量,所以这

Hasp_InstalledVersion &gt;= Hasp_BundleVersion

becomes

0.0.0.0 >= 7.54.8889.1

这是错误的。

要解决此问题,请定义

<Variable Name="Hasp_BundleVersion" Type="version" Value="7.54.8889.1" />

但不定义

<Variable Name="Hasp_InstalledVersion" Type="version" Value="0.0.0.0" />

现在它应该将注册表搜索中的字符串变量与 proj 文件中定义的版本变量进行比较。在burn的condition.cpp中,如果有一个“字符串变量OPERATION版本变量”,它会尝试将字符串变量转换为版本变量并进行版本比较。


Wix 烧伤状况评估有点令人困惑。

我不久前进行了深入研究,以找出这个确切的问题。我认为问题在于您错误地定义了版本值。

另外,我不确定你是否可以使用

<Variable Name="Hasp_InstalledVersion" Type="version" Value="0.0.0.0" />

因为RegistrySearches 设置的所有变量都是字符串变量。我不确定您现在是否最终定义了两个 Hasp_InstalledVersion 变量,因为一个是“版本”变量,另一个是“字符串”版本。不想深入研究 wix 源代码,我只想坚持将其保留为非类型变量,就像您的第一个代码片段中一样。

现在,在修复您的条件时,在条件评估中,根据所述变量的格式,将字符串变量提升为其他类型的变量。即: string op string 会进行字符串比较,string op version 会进行版本比较。

格式化变量以指示它是版本的方法是在其前面添加“v”。因此,我相信如果您将 Hasp_BundleVersion 更新为

<Variable Name="Hasp_BundleVersion" Value="v7.54.8889.1" />

或者更好的是,您可以在包含文件或属性文件中的某个位置定义版本(对于 msbuild,然后包含在 DefineConstants 中),并且可以将代码更新为

<Variable Name="Hasp_BundleVersion" Value="v$(var.HaspBundleVersion)" />

但我认为走到这一步只是一个偏好问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何比较burn (wix)中DetectCondition中的版本变量 的相关文章

  • 使用自定义操作卸载多个产品

    我正在为我们的产品开发基于 WIX 的安装程序 该产品有一个基础产品和许多插件 基础版和插件将作为单独的 MSI 提供 仅当底座可用时才能安装插件 基础和插件在根文件夹下共享公共文件夹树 例如 C Program files MyProdu
  • Wix如何隐藏功能选项

    我正在使用 Wix 3 5 构建 MSI 安装程序 我想知道是否有任何方法可以隐藏 功能自定义安装对话框 中的某些选项 您可以在其中从功能树中选择要安装的内容 我只想有 将安装在本地硬盘上 和 整个功能将不可用 的选项 目前 除了这两个选项
  • 在wix中,使用vbscript,如何写入日志文件?

    我正在自定义操作中尝试以下操作 Session Log GetOfficeBitness Session Property OfficeBitness 我收到错误 错误 1720 此 Windows Installer 程序包有问题 A 无
  • 如何确定现有应用程序的安装范围?

    我有一个基于的安装程序WixUI Advanced允许用户选择安装范围 每个用户或机器范围 升级时 安装了较低版本的现有应用程序 我想隐藏安装范围屏幕并自动选择他们上次选择的安装范围 如何判断先前安装使用的安装范围 Edit 查看我的 MS
  • 我应该如何处理 WiX 安装程序中的产品升级?

    我有一个相当大的 WiX 安装程序 250 Mb 以上 我正在尝试制定合适的升级策略 安装程序中的大多数文件都不会更改 并且当只有一两个文件发生更改时 我们不希望分发整个包 我研究了主要和次要升级 我的理解是 如果产品 ID 发生变化 只要
  • 为什么我无法将 ASP.NET Framework 版本显示为 3.5?

    有人可以向我确认一下 当我的应用程序是用 NET 3 5 编写时 这段代码 System Environment Version Major ToString 将产生这个 2 0 50727 1433 我刚刚迁移到 3 5 我迁移的第一个应
  • 如何比较 Python 中的版本号?

    我正在遍历一个包含鸡蛋的目录 将这些鸡蛋添加到sys path 如果目录中有同一个 egg 的两个版本 我只想添加最新的一个 我有一个正则表达式r P
  • 适用于多个项目的多个 Rails 版本

    我想在一个项目中使用 Rails 2 2 2 在另一个项目中使用 Rails 2 3 2 两者均已安装 What is rails 2 2 2 version应该做的 我读到它使 2 2 2 成为工作版本 也就是说 从那时起将使用的版本 但
  • 如何确定完整的 CUDA 版本 + 颠覆版本?

    Linux 上的 CUDA 发行版曾经有一个名为version txt例如 CUDA Version 10 2 89 这非常有用 但是 从 CUDA 11 1 开始 该文件不再存在 我如何在 Linux 上通过命令行确定并检查 path t
  • 从对话框调用 CustomAction 时出现 WiX 安装错误 2762

    我是初学者 开始学习WiX 我想在安装过程中捕获 验证和注册用户详细信息 我创建了一个对话框来捕获用户注册并在用户单击 下一步 后调用自定义操作 但在这里我收到安装程序错误 2762 虽然错误描述说 必须在 InstallInitializ
  • 寻找使用库版本的方法?

    我正在通过库在多个电子表格上部署脚本 但正如您所知 脚本 目前 还无法知道它是否正在运行最新版本 我试图通过为我的代码创建自己的版本控制来找到解决此问题的方法 我有一个 Web 服务返回我的库代码的最新版本号 以便我可以对其进行比较 但 o
  • WiX - 通过检查修订来防止降级

    我正在寻找一种方法来防止我的应用程序降级 但 问题 是 我必须检查修订号 例如 安装 1 0 0 1 时应该可以安装 1 0 0 2 但安装 1 0 0 2 时不应该安装 1 0 0 1 我知道 Element MajorUpgrade 仅
  • 找到的程序集的清单定义与程序集引用不匹配

    我试图在 C Windows 窗体应用程序 Visual Studio 2005 中运行一些单元测试 但出现以下错误 System IO FileLoadException 无法加载文件或程序集 实用程序 版本 1 2 0 200 文化 中
  • Burn in WiX 3.6 如何将 MSI 文件捆绑到 .exe 中?

    我有兴趣了解 WiX 如何捆绑使用 Burn 创建的 EXE 文件 我知道创建一个自解压 EXE 文件非常简单 我已经完成了一百万次了WinRAR http en wikipedia org wiki WinRAR EXE 文件解压到哪个目
  • 在每台计算机安装中删除 HKCU 下的注册表项

    我使用 WiX 3 6 构建了一个 perMachine 安装程序来安装我尚未开发的软件 不幸的是 该软件在执行期间在 HKCU 下创建了一些注册表项 卸载时 还应删除自行创建的密钥 移除这些钥匙似乎并不那么容易 我正在与 ICE57 和
  • Wix - 自定义安装目录

    我使用的是 Wix 3 x 用户应该能够选择目标目录 我的Setup wxs目前是这样的 http pastebin com uH1EjbDQ http pastebin com uH1EjbDQ 询问用户自定义目标目录的最简单方法是什么
  • 是否有其他方法可以访问延迟自定义操作中的会话详细信息?

    我有一个自定义操作 需要获取以下值才能将某些部分从安装文件夹复制到 VS2010 文件夹 VS2010目录路径 VS2010DEVENV财产 安装路径 INSTALLLOCATION财产 为了提供足够的权限 我将自定义操作设置为Execut
  • WiX 属性引用另一个属性

    我正在尝试为我的应用程序创建多个快捷方式 通过使用在命令行上传递不同的参数Arguments的属性Shortcut http wix sourceforge net manual wix2 wix xsd shortcut htm元素 我希
  • 维克斯。相同版本不同产品代码如何进行重大升级?

    基本上我需要改变这种行为 安装具有相同版本和升级代码的产品 但 不同的产品代码 是允许的 并被 MSI 视为两种产品 我需要将其作为重大升级进行威胁 因此 在 v 1 0 1 旧版本 不同的 ProductCode 上安装 v 1 0 1
  • R 提交到 CRAN:构建包的 R 版本?

    我想向 CRAN 提交一个包裹 在里面CRAN 存储库政策 http cran r project org web packages policies html它指出 当发布新的 R x y 0 版本时 R CMD 检查给出 错误 的包将被

随机推荐

  • 从名称实例化类?

    想象一下我有一堆与 C 相关的类 都扩展相同的基类并提供相同的构造函数 这些类是我在公共头文件 我包含的 中声明的 以及它们在其他一些文件中的实现 我静态编译和链接的 作为我的程序构建的一部分 我希望能够实例化其中一个并传递名称 该名称是必
  • 在 R 中使用 print() 打印换行符

    我正在尝试在 R 中打印多行消息 例如 print File not supplied nUsage program F filename quote 0 我得到输出 File not supplied nUsage program F f
  • Magento-如何使用模块在产品详细信息页面中添加新的自定义块

    我正在做一个 magento 定制网站 我需要添加产品的附加属性 如类型 版本等 我是 magento 的新手 如何将新的定制块添加到产品详细信息页面 我创建了一个模块 并且正在使用下面的编码 应用程序 代码 本地 SmartGrowth
  • DateFormatter 那是不是很挑剔?

    有谁知道 Java 中的 DateFormatter 不是那么挑剔吗 我的意思是我可以提供多种格式来写入日期 如果我提供如下格式 yyyy MM dd HH mm ss Z 用户可以输入 2010 11 02 10 46 05 0600 o
  • Swift 4 可通过未知动态键进行解码

    我有以下 JSON DynamicKey 6410 Meta name page DynamicKey 在编译时是未知的 我正在尝试查找如何进行的参考 使用可解码解析此结构 public struct MyStruct Decodable
  • iPad 模态视图控制器即使在横向模式下也能以纵向方式运行

    我在横向模式下呈现 ModalViewController 时遇到一些困难 基本上 它以正确的界面方向显示 并且仅当设备处于横向模式时才旋转 但视图控制器的行为就像处于纵向模式一样 我正在像这样呈现模式 BOOL application U
  • 将 VisualSVN 服务器附加到现有存储库

    最近所有的 VisualSVN Server 帖子都让我想查看一下 我现在通过 Apache 运行 SVN 但我想尝试 VisualSVN Server 主要用于 Active Directory 集成 他们的文档没有描述您是否可以轻松迁移
  • Java服务器自签名证书+客户端证书和SSL握手_失败

    我正在连接到之前成功使用过的 Web 服务 但现在他们更改了主机名并向我发送了两个 pem 文件 一个是 CA 另一个是我的新客户证书 我正在使用 Java 1 5 Spring Spring Web Services 和 Apache h
  • 打印页面时如何将 Bootstrap 3 列扩展为整个页面宽度?

    当打印我的应用程序中的页面时 我想隐藏侧面导航并将主要内容的宽度扩展为完整的 12 列 我正在使用 Bootstrap 3 这是当前的 html css div class row div class col md 3 side navig
  • 如何通过 facebook 获取用户的好友列表?

    假设我要让用户使用 facebook 登录我的网站 网址如下 http www facebook com dialog oauth client id appId redirect uri return scope user birthda
  • 如何在 Rust 中实现具体错误类型和 Box 的 From ?

    这是我的测试代码 use std error Error use std fmt struct Handler error String derive Debug struct SpecificError impl fmt Display
  • 使用 AES-CFB 在 python 中加密并在 Java 中解密

    我知道一个与此非常相似的问题 如何在 Python 中加密并在 Java 中解密 但我有一个不同的问题 我的问题是 我无法在 Java 中正确解密 尽管使用了正确的密钥和 IV 解密后我仍然得到垃圾字符 我在 Java 中没有任何编译 运行
  • 如何从 java 将 json 字符串发送到 .NET REST 服务?

    我正在尝试将 json 字符串从我的 Android 客户端发送到我的 net Rest 服务 谁能帮助我解决这个问题 HttpClient client new DefaultHttpClient HttpPost post new Ht
  • 如何在 Android 中将视频上传到 YouTube?

    我想从我的 Android 应用程序上传视频文件 有任何想法吗 通过使用年初至今的 Android here演示项目可用吗 你可以上传 youtube 视频 如果您有固定的用户名和密码 那么 看到这个answer 有一个 niec 正在发育
  • 代码签名错误 - 命令 /usr/bin/codesign 失败,退出代码为 1

    因此 我上周一直在尝试解决以下错误 但无济于事 即使按照我自己不久前对自己问题的回答中的步骤进行操作 到目前为止 我已经尝试了列出的所有 巫术 解决方案Here here here here and here一切都无济于事 请 如果有人可以
  • 如何将整个keras模型变成theano函数

    我想将我的 keras 模型转换为 theano 函数 以便我可以计算输入的梯度 我认为这对于可视化网络来说可能很酷 我想根据神经网络的想法 使用这些梯度来增强原始图像中的特征 我不明白以下代码我做错了什么 model Sequential
  • FTP 下载,带有显示当前下载状态的文本标签

    我制作了一个 GUI 点击后 下载 按钮程序将从 FTP 服务器下载文件 这样做时 我希望标签更新 例如 正在连接 gt 正在下载 gt 已下载 我尝试使用线程模块执行此操作 但似乎不起作用 def updater self self up
  • Java mcrypt_create_iv

    Java 是否有等效的 mcrypt create iv 函数 我正在创建一个论坛 我需要用户不仅能够在网站上注册 而且还能够在客户端内注册 如果可能的话 我希望两种注册方法都使用相同的加密 没有单个调用来创建随机 IV 如果您忽略 IV
  • java.lang.NoClassDefFoundError: org/apache/xpath/XPathAPI

    我正在 eclipse 中通过 main 执行一个类 结果我收到此错误 java lang NoClassDefFoundError org apache xpath XPathAPI 我正在使用jRE6 请帮我解决这个问题 确保你有xal
  • 如何比较burn (wix)中DetectCondition中的版本变量

    这是我的Fragment