Wix Burn:注册表搜索失败时取消设置变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Wix Burn:注册表搜索失败时取消设置变量相关的知识,希望对你有一定的参考价值。

在我的Bundle项目中,我正在搜索注册表以获取版本并设置变量:

<Variable Name="Installed_Ver" bal:Overridable="yes" Type="version" Value="0.0.0.0" Persisted="yes" />

<util:RegistrySearch
  Id="Self_Ver"
  Root="HKLM"
  Key="SoftwareMyCompanyMyProductName"
  Value="Version"
  Variable="Installed_Ver"  
  Format="raw"
  Win64="yes"

/>

并在条件中使用此作为:

<util:RegistrySearchRef Id="Self_Ver"  />
<bal:Condition Message="A recent or same version of this product is already installed on this machine. Please contact product support for more information." >
  <![CDATA[WixBundleInstalled OR (WixBundleFileVersion > Installed_Ver)]]>
</bal:Condition>

如果存在HKLM Software MyCompany MyProductName Version,这可以正常工作。但是,如果此注册表不存在,则注册表搜索将失败,并且取消设置变量“Installed_Ver”。这会导致错误地评估错误的条件。

通过定义,我试图设置一个默认值,即“0.0.0.0”,因此它应该有一些值,条件将被正确评估,在这种情况下为True。

这是日志,显示它是取消设置变量'Installed_Ver'。

[5898:2AC4] [2018-08-30T13:15:08] i000:将字符串变量'WixBundleName'设置为值'RegVersionCheck'[5898:2AC4] [2018-08-30T13:15:08] i000:设置字符串变量'WixBundleManufacturer'重视'测试'[5898:3354] [2018-08-30T13:15:08] i000:将数值变量'WixStdBALanguageId'设置为值1033 [5898:3354] [2018-08-30T13:15:08 ] i000:将版本变量'WixBundleFileVersion'设置为值'7.1.2.3'[5898:2AC4] [2018-08-30T13:15:08] i100:检测开始,1个包[5898:2AC4] [2018-08-30T13 :15:08] i000:找不到注册表项。 Key ='Software MyCompany MyProductName'[5898:2AC4] [2018-08-30T13:15:08] i000:取消设置变量'Installed_Ver'[5898:2AC4] [2018-08-30T13:15:08] i101:检测到的包:MainProduct,state:Absent,cached:None [5898:2AC4] [2018-08-30T13:15:08] i104:检测到的包:MainProduct,feature:CalculatorFeature,state:Absent [5898:2AC4] [2018- 08-30T13:15:08] i052:条件'WixBundleInstalled OR(WixBundleFileVersion> Installed_Ver)'的计算结果为false。 [5898:2AC4] [2018-08-30T13:15:08] e000:此机器上已安装此产品的近期或相同版本。请联系产品支持以获取更多信息。 [5898:2AC4] [2018-08-30T13:15:08] e000:错误0x81f40001:捆绑条件评估为false:WixBundleInstalled OR(WixBundleFileVersion> Installed_Ver)[5898:2AC4] [2018-08-30T13:15:08] i199:检测完成,结果:0x0

我尝试通过硬编码“0.0.0.0”代替Installed_Ver的条件,它工作正常。

如果注册表搜索失败,我应该如何获得Installed_Ver的默认值?

谢谢

答案

这是一个open bug。您应该能够通过更新条件来解决此问题,以便在未定义变量时进行处理。

WixBundleInstalled OR ((WixBundleFileVersion > Installed_Ver) AND Installed_Ver)
另一答案

经过一些搜索后,我找到了一些解决方法,以便我可以使用在Variable定义中设置的默认值(0.0.0.0)。我定义了另一个搜索相同的注册表项并获取布尔(存在)变量,并根据此变量决定触发原始搜索并获取版本值。这是我的解决方案:

<Fragment Id="Self_Install_Check">

<?define ProdRegKey=SoftwareMyCompanyMyProductName?>
<Variable Name="Installed_Ver" bal:Overridable="yes" Type="version" Value="0.0.0.0" Persisted="yes" />

<util:RegistrySearch
  Id="Self_Ver"
  After="ProdRegExist"
  Condition="ProdRegKeyExist"
  Root="HKLM"
  Key="$(var.ProdRegKey)"
  Value="Version"
  Variable="Installed_Ver"
  Format="raw"
  Win64="yes"
/>

<util:RegistrySearch
  Id="ProdRegExist"
  Root="HKLM"
  Key="$(var.ProdRegKey)"
  Value="Version"
  Variable="ProdRegKeyExist"
  Result="exists"
  Format="raw"
  Win64="yes"
/>
</Fragment>

所以现在只有ProdRegKeyExist变为true才会触发读取版本的注册表搜索,而在保留value = 0.0.0.0时,Installed_Ver将不会被取消,否则将从注册表中获取Version值...

以上是关于Wix Burn:注册表搜索失败时取消设置变量的主要内容,如果未能解决你的问题,请参考以下文章

Wix Burn exepackage 属性

WiX Burn:从注册表中读取 LaunchTarget

WIX - 在注册表中写入属性

Wix 3.7 Burn - 如何使用动态信息制作自定义启动画面

如何将文件添加到 WiX Burn 中的 Container 元素?

WiX - Burn 支持两用 msi 包吗?