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

Posted

技术标签:

【中文标题】WiX Burn - 根据条件设置 InstallFolder 变量【英文标题】:WiX Burn - Setting InstallFolder variable based on a condition 【发布时间】:2013-12-12 20:50:43 【问题描述】:

我正在使用 WiX 3.6(但如有必要可以升级到 3.8)并且有一个用 BURN 编写的引导程序,这几乎可以满足我的所有需求,除了这个问题;我似乎无法破解。

我有两个变量; Product_XYZ 和 Product_ABC。第一个包含通过注册表搜索填充的文件夹路径(因此,如果搜索未找到我的 reg 密钥,它可能是空白的),另一个是硬编码的(即“[ProgramFilesFolder]\ABC”)。

我只是(?)想将 InstallFolder 变量(以便它通过选项按钮显示在 UI 中)设置为 Product_XYZ 变量中的值(如果它不是空白的话)。如果为空,我想将 InstallFolder 设置为 Product_ABC 中的值。

If Product_XYZ <> "" then
    InstallFolder = [Product_XYZ]
else
    InstallFolder = [Product_ABC]
endif 

但显然使用 BURN 逻辑!!

谁能帮帮我?

干杯,

克里斯。

【问题讨论】:

这可能会有所帮助:***.com/questions/10501995/… 感谢您的回复,但是在这种情况下这对我没有帮助。 【参考方案1】:

我有同样的需求,通过查看 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' />

&lt;Variable/&gt; 元素定义了默认值。

&lt;util:RegistrySearch/&gt; 查找注册表值(如果找到,将其保存在名为 PreviousInstallFolder 的新变量中)。

&lt;util:DirectorySearch/&gt; 仅在找到注册表项时执行。它检查目录是否存在,如果存在则设置InstallFolder

注意,如果注册表值存在,但它指定的目录不存在,那么将使用默认值代替。

【讨论】:

马克,对不起,我从来没有回复你的答案——那是因为我从来不知道它在那里(以为我会收到来自这个网站的电子邮件?!)。今天我正要发布另一个关于我的引导程序的问题,但是当我进入这个主题时,它提示我提出了我提出的这个老问题,那时我注意到了你的回答。读完后,我认为这是对我最初所做的更好的解决方案;尽管我的解决方案有效,但我还是尝试了您的解决方案。它确实有效 - 但更好的是,它实际上解决了我要问的新问题!这么多,非常感谢!【参考方案2】:

    如果您设置正确并且可以通过属性更改安装位置,您应该测试您的 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。

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

    <MsiPackage Id="someid" Source="$(var.msi)Yourinstaller.msi">
        <MsiProperty Name="INSTALLDIR" Value="[InstallFolder]" />
    

注意,当您将 INSTALLDIR 属性路径发送到 msi 时,它必须是完整路径。

【讨论】:

以上是关于WiX Burn - 根据条件设置 InstallFolder 变量的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Wix Burn 安装程序包含完整的 .NET 先决条件

WiX - Burn 支持两用 msi 包吗?

Wix Burn:自定义引导程序升级,但与旧版本并排安装

Wix Burn:注册表搜索失败时取消设置变量

如何在 WIX 中的包的安装条件中使用可执行文件的退出代码

Wix安装 - 使用Burn来管理UI并将相同的进度文本显示为内置对话框