WiX Burn - 根据条件设置InstallFolder变量

时间:2013-12-12 20:50:44

标签: wix burn

我正在使用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逻辑!!

有人可以帮助我吗?

干杯,

克里斯。

2 个答案:

答案 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)

  1. 如果您已正确设置并且可以通过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。

  2. 在有条件地设置变量(InstallFolder)后的Burn中,您需要使用MsiProperty元素将其传递给MSIpackage。例如

    <MsiPackage Id="someid" Source="$(var.msi)Yourinstaller.msi">
        <MsiProperty Name="INSTALLDIR" Value="[InstallFolder]" />
    
  3. 注意,当您向msi发送INSTALLDIR属性路径时,它必须是完整路径。