首页 > 解决方案 > 未为安静安装设置 Wix 目录 ID 符号值

问题描述

我的 WIX 项目有问题。当我进行正常的 GUI 安装时,一切都按预期工作。但是,当我执行 /q(安静)安装时,我的目录 ID 符号之一没有被设置。(可能是因为安静安装没有 UI 序列。但是,我到底做错了什么让我感到困惑。)

在我的 Product.wxs 中,我有一个像这样开始的目录树:

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="ProgramFilesFolder" Name="PFiles">
    <Directory Id="COMPANY" Name="Company">
      <Directory Id="BRANCHALL" Name="Branch">
        <Directory Id="INSTDIR" Name="Replaced">
          <Directory Id="BINDIR" Name="Bin">

就在我设置目录的下面,因为我们的应用程序安装将安装 ID 作为用户输入字符串,它成为目录路径的一部分。(它也可以在静默安装命令行中传递。)因此,就在上面的目录树定义下,我有:

<SetDirectory Id="INSTDIR" Value="[BRANCHALL]\[INSTID]" Sequence="execute" />
<SetDirectory Id="BINDIR" Value="[BRANCHALL]\[INSTID]\Bin" Sequence="execute" />

...ETC

当我进行静默安装时,日志显示以下内容:

MSI (s) (F8:84) [20:55:29:702]: Product: ProductName - Instid -- Error 1606. Could not access network location \Instid.
Error 1606. Could not access network location \Instid.
Action ended 20:55:29: CostFinalize. Return value 3.
Action ended 20:55:29: INSTALL. Return value 3.
Property(S): UpgradeCode = {9AC2D8DF-5EF7-440B-A0D2-4A97FA62368C}
Property(S): INSTID = Instid
Property(S): BRANCHALL = C:\Program Files (x86)\Company\Branch\
Property(S): POWERSHELLEXE = C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe
Property(S): BINDIR = \Instid\Bin

请注意,虽然记录的 BRANCHALL 值是正确的,但 BINDIR 符号缺少 BRANCHALL 值,但确实正确获取了 INSTID 值。

运行 GUI(非静默)安装时的相同日志片段:

Property(C): UpgradeCode = {9AC2D8DF-5EF7-440B-A0D2-4A97FA62368C}
Property(C): INSTID = Instid
Property(C): BRANCHALL = C:\Program Files (x86)\Company\Branch\
Property(C): POWERSHELLEXE = C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe
Property(C): LicenseAccepted = 1
Property(C): BINDIR = C:\Program Files (x86)\Company\Branch\Replaced\Bin\

奇怪的是,BRANCHALL 属性详细说明,而 INSTID 没有。然而安装工作正常并将所有文件放在正确的文件夹中。所以 INSTID 一定是在 msiexec 制作了这些日志之后详细说明的。

如果这缺少所需的信息,请问我。我有点迷惑,当然也不是 WIX 专家。谢谢!

标签: wixwindows-installercustom-action

解决方案


我现在没有时间写一个完整的答案,但这里有一些提示:

技术:当您在设置属性/设置目录自定义操作中引用另一个目录属性时,我相信您需要在之后运行自定义操作CostFinalize才能将其他属性设置为任何值。当你这样做时,你需要使用 aType 35 custom action而不是 aType 51 custom action。请参阅 MSDN:更改目录的目标位置。我使用 a 的烟雾测试Type 35 action似乎有效。明天我将进行更多测试,并更详细地更改此答案。


注意!未正确测试

<SetProperty Id="INSTDIR" Value="[BRANCHALL]\[INSTID]" After="CostFinalize" />

您可以尝试使用上述标记代替您当前的 SetDirectory 元素。编译 MSI 后,您必须“修复”它以将 CustomAction 表中的自定义操作从 Type 51 更改为 Type 35(只需将 Type 列中的 51 更改为 35) - 然后运行测试安装。使用 Orca 或同等产品来执行此修补程序。我只是添加了这个,所以你可以尝试一下,我没有正确测试它


备择方案?:总的来说,我建议您不要以这种方式重定向文件夹属性。我发现它不可靠并且充满了意想不到的问题。事实上,我看不出这种方法将如何允许您多次安装 MSI - 由于整体 Windows Installer 设计(不允许直接同时安装)。如果您想多次安装相同的 MSI,那么您可能想要略读几个预先存在的答案:

我不知道您是否在公司环境中,但App-V很多公司都在使用。这不是我的一杯茶(至少目前是这样),但应该提一下,以便您了解什么可以满足您的要求(我们仍然需要正确理解)。

这是不完整的,明天将检查。


推荐阅读