我正在使用WiX 3.6(但如果需要可以升级到3.8)并且有一个用BURN编写的启动器,这几乎可以完成我需要的一切,除了这一个问题;我似乎无法破解。
我有两个变量; Product_XYZ和Product_ABC。第一个包含通过注册表搜索填充的文件夹路径(因此如果搜索没有找到我的reg密钥,它可能是空白的),另一个是硬编码的(即“[ProgramFilesFolder] \ ABC”)。 / p>
我只是(?)想要将InstallFolder变量(通过“选项”按钮在UI中显示)设置为Product_XYZ变量中的值(如果它不是空白的话)。如果它是空白的,我想将InstallFolder设置为Product_ABC中的值。
即
If Product_XYZ <> "" then
InstallFolder = [Product_XYZ]
else
InstallFolder = [Product_ABC]
endif
但显然使用BURN逻辑!!
有人可以帮助我吗?
干杯,
克里斯。
答案 0 :(得分:13)
我有同样的需求,通过查看WiX自己的软件包找到了解决方案:
<Variable
Name='InstallFolder'
Type='string'
Value='[ProgramFilesFolder]WiX Toolset v$(var.WixMajorMinor)' />
<util:RegistrySearch
Id="PreviousInstallFolderSearch"
Root='HKLM'
Key='SOFTWARE\Microsoft\Windows Installer XML\$(var.WixMajorMinor)'
Value='InstallFolder'
Variable='PreviousInstallFolder' />
<util:DirectorySearch
Path='[PreviousInstallFolder]'
Variable='InstallFolder'
After='PreviousInstallFolderSearch'
Condition='PreviousInstallFolder' />
<Variable/>
元素定义默认值。
<util:RegistrySearch/>
查找注册表值(如果找到,则将其保存在名为PreviousInstallFolder
的新变量中)。
<util:DirectorySearch/>
仅在找到注册表项时执行。它会检查目录是否存在,如果存在,则设置InstallFolder
。
请注意,如果注册表值存在,但它指定的目录不存在,则将使用默认值。
答案 1 :(得分:2)
如果您已正确设置并且可以通过Property更改安装位置,则应测试MSI(无刻录) 根据您的目录设置,这只是一个示例:
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder>
<Directory ID="INSTALLDIR" Name="FolderName" />
...
</Directory>
使用msiexec测试你的msi,例如:
msiexec /i package.msi /qb+ INSTALLDIR="C:\Programs\ABC"
如果它没有安装在您指定的位置,那么首先需要修复您的WiX msi,以便它可以接受INSTALLDIR。
在有条件地设置变量(InstallFolder)后的Burn中,您需要使用MsiProperty
元素将其传递给MSIpackage。例如
<MsiPackage Id="someid" Source="$(var.msi)Yourinstaller.msi">
<MsiProperty Name="INSTALLDIR" Value="[InstallFolder]" />
注意,当您向msi发送INSTALLDIR属性路径时,它必须是完整路径。