在我的Bundle代码中,我正在尝试使用注册表搜索的结果来设置要在我的自定义Boostrapper中使用的变量:
<util:RegistrySearch
Id="ThirdPartyInstallDirSearch"
Variable="THIRDPARTY_INSTALL_DIR"
Root="HKLM"
Key="SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
Value="OceanSoftDir"
Result="exists"
/>
<Variable Name="THIRDPARTY_INSTALL_DIR" Type="string" Value="$(var.THIRDPARTY_INSTALL_DIR)"/>
但这会产生错误: 未定义的预处理器变量'$(var.THIRDPARTY_INSTALL_DIR)'
基本上,我想将注册表搜索的结果传递给我的自定义引导程序应用程序。
由于
答案 0 :(得分:1)
正如错误所述,$(var.<NAME>)
是来自wxi文件或项目文件<DefineConstants>name=value</DefineConstants>
或<?define?>
的预处理器定义。您可以阅读有关预处理器here.
对于您的问题,注册表搜索本身应该定义变量。我在引导程序中执行类似于您想要的操作。
<Fragment>
<util:RegistrySearch
Id="ClientInstalledCheck"
Root="HKLM"
Key="SOFTWARE\Client"
Value="ClientPath"
Result="value"
Variable="ClientInstalled"/>
<util:DirectorySearch
Path='[ClientInstalled]'
Variable='InstallFolder'
After='ClientInstalledCheck'
Condition='ClientInstalled' />
</Fragment>
然后在bootstrapper安装的产品中,我会将“InstallFolder”值传递给这些安装。
<MsiProperty Name="INSTALLDIR" Value="[InstallFolder]"/>
这样,如果用户安装在非默认安装位置,我们会选择他们选择的自定义位置并使用它。如果注册表项不存在,我们使用默认位置。
我还使用默认位置定义了InstallFolder变量(因为我的用例与你的用例略有不同)为
<Variable Name="InstallFolder" Type="string" Value="[ProgramFilesFolder]$(var.CompanyInstallDir)\" bal:Overridable="yes" Persisted="yes"/>
其中CompanyInstallDir通过<DefineConstants>
定义为预处理器变量,最初在MSBuild属性文件中的某处定义。
因此,为了解释您的问题,您正在混合预处理程序指令和变量。在注册表搜索中,您使用的是Result="exists"
,它将变量THIRDPARTY_INSTALL_DIR设置为“0”或“1”。您想使用Result="value"
。这会将注册表位置的值放在您在Variable=""
属性中定义的变量中。
如果您使用条件进行注册表搜索+目录搜索,则当且仅当注册表存在且该目录实际存在于计算机上并正确处理不存在但仍处于注册表状态的情况时,您可以正确设置变量存在。
有些事情可能会有所不同,因为用例略有不同,但希望这会让您走上正确的道路,做您需要做的事情。