使用WiX,如何在某个注册表项不存在时跳过组件?

时间:2013-12-09 18:28:57

标签: wix wix3.5

我想将一些文件复制到另一个产品的安装树中的目录中,但仅限于安装该产品的目录。所以我想我可以根据注册表搜索设置一个属性来查找该产品的安装根目录。然后我可以在组件元素的条件元素中使用该属性。

这是我的代码。出于某种原因,我在未安装其他产品时出现错误,并且由于找不到注册表项,因此注册表搜索为空。

<Property Id="PRODUCTPATH">
  <RegistrySearch Id="PRODUCTPATH" Root="HKLM" Key="_MY_KEY_" Name="_MY_NAME_" Type="raw" />
</Property>

<SetProperty Id="PRODUCTBINPATH" Value="[PRODUCTPATH]\BIN" After="AppSearch"/>

<Component Id="CommonDLLs" Guid="_MY_GUID_" Directory="INSTALLLOCATION">
  <Condition>PRODUCTPATH</Condition>
  <RegistryValue Id="_MY_ID_" Root="HKLM" Key="_MY_KEY_2" Name="Installed" Value="1" Type="integer" KeyPath="yes" />
  <CopyFile Id="myfile1.dll" FileId="myfile1.dll" DestinationProperty="PRODUCTPATH" DestinationName="myfile1.dll"/>
  <CopyFile Id="myfile2.dll" FileId="myfile2.dll" DestinationProperty="PRODUCTPATH" DestinationName="myfile2.dll"/>
</Component>

2 个答案:

答案 0 :(得分:0)

尝试使用util:RegistrySearch而不是RegistrySeach 这个元素随Util Extension一起提供。如果您不知道如何使用扩展程序,请检查here

util:RegistrySearch有一个属性(Result),用于仅检查密钥是否存在。

就像那样:

<util:RegistrySearch
   Id="PRODUCTPATH"
   Variable="PRODUCTPATH"
   Root="HKLM" 
   Key="_MY_KEY_" 
   Format="raw"
   Result="exists">

答案 1 :(得分:0)

实际上,您所要做的就是为SetProperty元素添加一个条件,如下所示:

<Property Id="PRODUCTPATH">

<SetProperty Id="PRODUCTBINPATH" Value="[PRODUCTPATH]\BIN" After="AppSearch">PRODUCTPATH</SetProperty>