wix - 未为安静安装设置 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 专家。谢谢!
解决方案
我现在没有时间写一个完整的答案,但这里有一些提示:
技术:当您在设置属性/设置目录自定义操作中引用另一个目录属性时,我相信您需要在之后运行自定义操作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,那么您可能想要略读几个预先存在的答案:
- 我想安装 MSI 两次(来自serverfault.com - 我的回答在页面下方)。
- 在 wix 安装程序中禁用修复模式和升级(略有不同)
我不知道您是否在公司环境中,但App-V
很多公司都在使用。这不是我的一杯茶(至少目前是这样),但应该提一下,以便您了解什么可以满足您的要求(我们仍然需要正确理解)。
这是不完整的,明天将检查。
推荐阅读
- dictionary - ABAP 中的字典。如何?
- c - 如何延迟关闭继电器(毫秒)
- python-3.x - 读取 CSV 文件时出现问题
- java - 如何将 SearchView 与自定义 ArrayAdapter 和 ListView 与子项一起使用
- angular - 我可以有一个不呈现伪元素的组件吗?
- javascript - 从 PerformanceNavigationTiming 确定导航类型
- c# - NUnit - SetUp、Test 和 TearDown - 未调用
- c# - 具有表单状态值的自定义 FormDialog 描述:MS BOT C#
- hyperledger-fabric - Hyperledger Fabric 中的访问控制列表
- javascript - 为什么当我处理新列表时父列表对象的属性会更新