我有一个msi(用WIX编写),它有一个绑定到自定义属性的复选框(称之为MY_PROPERTY)。我想从命令行运行此msi,为此属性指定0(未选中)或1(已选中)。我的脚本将确定适当的值(基于环境)并将该值注入msiexec命令行。我的命令行看起来像这样:
msiexec /i my_installer.msi MY_PROPERTY=$value
其中$ value为1或0,具体取决于环境。问题是,无论我在命令行为MY_PROPERTY提供什么值,都会选中复选框(并且该属性将始终设置为1)。取消选中复选框的唯一方法是不指定属性(保留未定义)。应该注意,无论UI是否显示,都会出现这种情况(在上面的命令行中添加“/ quiet”不会改变这种行为)。
This msdn post似乎表明这是Windows安装程序中已知的“错误”(或者更准确地说,无论创作系统编写的是msi)。建议使用post-build msi hack作为解决方案。我想知道是否有人遇到过这个问题并提出了更好的解决方法/解决方案。谢谢!
我看到了这个问题的三个解决方案:
我目前倾向于选项3,尽管选项1可能是我原始问题的最佳答案。有什么想法吗?
答案 0 :(得分:8)
这就是“假设”工作的方式 - 基本上,在用户选中复选框之前该属性不存在,然后它被“设置”(存在)。因此,如果要在选中复选框时执行自定义操作,则测试是否存在属性作为运行自定义操作的条件,而不是检查自定义道具设置为的值。
我认为从命令行处理此问题的最佳方法是您已经提到的:如果您希望选中该复选框,请在命令行中指定自定义prop,否则,请不要选中该复选框被选中。
答案 1 :(得分:5)
正如您所发现的,当属性未定义(空白)时,复选框为true(已选中)(非空白)和false(未选中)。听起来你需要将环境1或0字符串转换为复选框true / false,其中1或0在命令行传入。尝试使用set-property自定义操作,将属性设置为{}
(空白),条件为属性已为"0"
。在安装UI和安装执行序列中尽早安排它。
延迟更新:关于需要多个自定义操作来处理多个复选框,您可以选择。您可以创建多个set-property操作(好处:很容易分辨他们正在做什么;成本:其中很多),或者您可以创建一个基于代码的自定义操作,该操作会将Checkbox
table用于列表将0
转换为空白的属性(收益:一个操作;成本:文档记录不清,自定义代码)。后一种方法的第二个优点是,您可以处理异常的Value
设置,例如在选中时应将属性设置为0
的复选框。