如何在刻录中比较 DetectCondition 中的版本变量(wix)

rol*_*i09 1 wix version burn

这是我的 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>
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为它似乎将两个值作为字符串进行比较。这是日志:

[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.
Run Code Online (Sandbox Code Playgroud)

如果我更改为 type 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>
Run Code Online (Sandbox Code Playgroud)

日志:

[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.
Run Code Online (Sandbox Code Playgroud)

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

我究竟做错了什么?

Bri*_*and 5

水平线下方是我的原始回复,我认为这是错误的。您像 roli09 一样定义了一个版本变量,即:

<Variable Name="Hasp_BundleVersion" Type="version" Value="7.54.8889.1" />
Run Code Online (Sandbox Code Playgroud)

而且你不需要'v'。如果您正在执行以下条件,则确实需要 v:

Condition="InstalledVersion &gt;= v7.0.2.1"
Run Code Online (Sandbox Code Playgroud)

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

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

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

Hasp_InstalledVersion &gt;= Hasp_BundleVersion
Run Code Online (Sandbox Code Playgroud)

变成

0.0.0.0 >= 7.54.8889.1
Run Code Online (Sandbox Code Playgroud)

这是错误的。

要解决此问题,请定义

<Variable Name="Hasp_BundleVersion" Type="version" Value="7.54.8889.1" />
Run Code Online (Sandbox Code Playgroud)

但不定义

<Variable Name="Hasp_InstalledVersion" Type="version" Value="0.0.0.0" />
Run Code Online (Sandbox Code Playgroud)

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


Wix 烧伤状况评估有点混乱。

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

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

<Variable Name="Hasp_InstalledVersion" Type="version" Value="0.0.0.0" />
Run Code Online (Sandbox Code Playgroud)

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

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

格式化变量以表明它是一个版本的方法是在它前面放一个“v”。因此,我相信如果您将 Hasp_BundleVersion 更新为

<Variable Name="Hasp_BundleVersion" Value="v7.54.8889.1" />
Run Code Online (Sandbox Code Playgroud)

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

<Variable Name="Hasp_BundleVersion" Value="v$(var.HaspBundleVersion)" />
Run Code Online (Sandbox Code Playgroud)

但走这么远只是我认为的偏好问题。