如何使用更新条件在 Wix 中设置变量?

Posted

技术标签:

【中文标题】如何使用更新条件在 Wix 中设置变量?【英文标题】:How can I use an update condition to set variables in Wix? 【发布时间】:2017-11-27 08:38:14 【问题描述】:

我们正在使用 Wix V3.11 为我们的 C#-应用程序构建一个 msi 设置。我们为每个版本提供 32 位和 64 位版本:

32 位 版本的预分配安装路径是:'C:\Program Files (x86)'。

64 位 设置的预分配安装路径是:'C:\Program Files'。

我们使用以下声明来设置路径:

<?define bitness = $(var.Platform) ?>
<?if $(var.Platform) = "x86" ?>
<?define ProgramFilesPath = ProgramFilesFolder?>
    <?define Win64 = no?>
<?else?>
<?define ProgramFilesPath = ProgramFiles64Folder?>
    <?define Win64 = yes?>
<?endif?>

在这里使用变量:

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="$(var.ProgramFilesPath)" Name="$(var.ProgramFilesPath)">

        [... more folder ...]

  </Directory>
</Directory>

问题:当消费者将第一次安装的路径更改为例如'C:/MyFolder' 并执行更新,然后 msi 设置将软件移动到 'C:\Program Files (x86)' 或 'C:\Program Files'。

问题:如何在更新时保留第一次安装的自定义安装路径“C:/MyFolder”?也许我可以使用任何“更新”条件?我的想象:

<?define bitness = $(var.Platform) ?>
<?if UPDATE ?> <!-- here -->
    <?if $(var.Platform) = "x86" ?>
    <?define ProgramFilesPath = ProgramFilesFolder?>
        <?define Win64 = no?>
    <?else?>
    <?define ProgramFilesPath = ProgramFiles64Folder?>
        <?define Win64 = yes?>
    <?endif?>
<?endif?>

【问题讨论】:

【参考方案1】:

假设“更新”是指重大升级,因为如果补丁或次要更新将所有文件从一个位置移动到另一个位置,那将是非常奇怪的。

如果您使用通常的 WiX 属性名称,则用户选择的目录将是 INSTALLFOLDER,但不清楚您使用的是该名称还是 TARGETDIR。基本上,您可以将用户的最终选择存储在注册表项中(或使用 WiX“记住属性”模式)。在主要升级中,您可以检索该属性并将您的 INSTALLFOLDER 值设置为该目录,条件是设置了 WIX_UPGRADE_DETECTED(主要升级元素中使用的默认属性 ID)。大概您还将禁止允许用户选择文件夹的浏览对话框。

话虽如此:

    如果应用程序继续运行,您为什么不希望用户在他们愿意的情况下将主要升级安装到新位置,这一点尚不清楚。

    这些默认文件夹并没有真正预先分配 - 它们只是标准默认值。它们是推荐的位置,因此最好禁止更改它们,因为可能会出现意外行为。例如,尝试将 32 位 MSI 安装到 x64 系统上的本机程序文件文件夹将导致重定向到程序文件 (x86) 位置,这可能会让用户感到惊讶。

【讨论】:

以上是关于如何使用更新条件在 Wix 中设置变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在弹性豆茎中设置/更新 PATH 变量?

如何使用 HUE 在 Impala 查询中设置变量?

Wix 3.7 Burn - 如何使用动态信息制作自定义启动画面

使用 Apache 时在 PHP 中设置用于访问的环境变量

如何刷新我在 ServletContextListener 中设置的 servlet 上下文变量?

WiX - 将参数从 MSI 传递到 Xeam 引导程序应用程序