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 3.7 Burn - 如何使用动态信息制作自定义启动画面