Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何比较burn(wix)中DetectCondition中的版本变量_Wix_Version_Burn - Fatal编程技术网

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

如何比较burn(wix)中DetectCondition中的版本变量,wix,version,burn,Wix,Version,Burn,这是我的片段 <Fragment> <Variable Name="Hasp_BundleVersion" Value="7.54.8889.1" /> <Variable Name="Hasp_IsInstalled" /> <Variable Name="Hasp_InstalledVersion" /> <util:RegistrySearch Id="Hasp_IsInstalled"

这是我的
片段

<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>
如果我更改为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>
我使用的是
变量
,因为我以后需要在自定义引导程序中访问这些值


我做错了什么?

水平线下方是我最初的回答,我认为这是错误的。 您将版本变量定义为roli09,即:

<Variable Name="Hasp_BundleVersion" Type="version" Value="7.54.8889.1" />
因此编译器将第二个操作数作为一个版本进行处理

我认为这里发生的是在第一个代码片段中,我们将两个版本都视为字符串变量。作为字符串,将它们逐个字符进行比较,并将“6”与“8”进行比较,结果为false

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

Hasp_InstalledVersion &gt;= Hasp_BundleVersion
变成

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中,如果您有一个“string variable OPERATION version variable”,它会尝试将string变量转换为版本变量并进行版本比较


Wix燃烧条件评估有点混乱

我不久前深入研究了这个问题。我认为问题在于您对版本值的定义不正确

还有,我不确定你能不能用

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

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

现在,在修复您的条件时,在条件求值中,根据所述变量的格式,将字符串变量提升为其他类型的变量。ie: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)" />


但我认为,走这么远只是一个偏好问题。

水平线下方是我最初的回答,我认为这是错误的。 您将版本变量定义为roli09,即:

<Variable Name="Hasp_BundleVersion" Type="version" Value="7.54.8889.1" />
因此编译器将第二个操作数作为一个版本进行处理

我认为这里发生的是在第一个代码片段中,我们将两个版本都视为字符串变量。作为字符串,将它们逐个字符进行比较,并将“6”与“8”进行比较,结果为false

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

Hasp_InstalledVersion &gt;= Hasp_BundleVersion
变成

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中,如果您有一个“string variable OPERATION version variable”,它会尝试将string变量转换为版本变量并进行版本比较


Wix燃烧条件评估有点混乱

我不久前深入研究了这个问题。我认为问题在于您对版本值的定义不正确

还有,我不确定你能不能用

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

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

现在,在修复您的条件时,在条件求值中,根据所述变量的格式,将字符串变量提升为其他类型的变量。ie: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)" />


但我认为,走这么远只是一种偏好。

我已经尝试过了。如果我只使用一个像这样的
变量
,那么burn会很快失败。[1D8C:296C][2017-03-29T18:07:20]i000:将版本变量“Hasp_BundleVersion”初始化为值“v7.54.8889.1”[1D8C:296C][2017-03-29T18:07:20]e000:错误0x80020005:复制变量值失败。[1D8C:296C][2017-03-29T18:07:20]e000:错误0x80020005:更改变体类型失败。失败的原因是版本号前面的“v”。如果我删除它,burn不会再失败,但是版本比较也不会成功:(我在顶部用新的答案更新了我的答案,并在下面留下了我的原始答案。我真的很感谢你