Wix 如何将复选框设置为";“未经检查”;从msiexec命令行?

Wix 如何将复选框设置为";“未经检查”;从msiexec命令行?,wix,windows-installer,Wix,Windows Installer,我有一个msi(用WIX编写),它有一个绑定到自定义属性(称为MY_属性)的复选框。我想从命令行运行此msi,为此属性指定0(未选中)或1(已选中)。我的脚本将确定适当的值(基于环境),并将该值注入msiexec命令行。我的命令行如下所示: msiexec /i my_installer.msi MY_PROPERTY=$value 其中$value为1或0,具体取决于环境。问题是,无论我在命令行中为我的_属性提供什么值,复选框始终处于选中状态(并且该属性将始终设置为1)。取消选中复选框的唯一

我有一个msi(用WIX编写),它有一个绑定到自定义属性(称为MY_属性)的复选框。我想从命令行运行此msi,为此属性指定0(未选中)或1(已选中)。我的脚本将确定适当的值(基于环境),并将该值注入msiexec命令行。我的命令行如下所示:

msiexec /i my_installer.msi MY_PROPERTY=$value
其中$value为1或0,具体取决于环境。问题是,无论我在命令行中为我的_属性提供什么值,复选框始终处于选中状态(并且该属性将始终设置为1)。取消选中复选框的唯一方法是不指定属性(不定义属性)。应该注意,无论UI是否显示,都会发生此行为(向上述命令行添加“/quiet”不会更改此行为)

似乎表明这是windows installer中已知的“bug”(或者更准确地说,是由任何创作系统编写的msi)。建议使用构建后msi黑客作为解决方案。我想知道是否有人遇到过这个问题,并提出了更好的解决方法。谢谢

更新 我认为这个问题有三种解决办法:

  • 在@Damien中,当属性值为0时,让包装器脚本不要将属性传递给msiexec。这使得脚本更加复杂,可能会阻止我覆盖默认为“checked”的复选框的值
  • 在@Michael Urman中,添加一个自定义操作,如果属性值为零,则清除该属性。这使得msi更加复杂,我必须为UI中的每个复选框添加这样的自定义操作
  • 另一个想法是简单地禁止在我们的msi安装程序中使用复选框,而是使用单选框或下拉框来回答“真/假”问题。虽然这限制了安装程序的UI选项,但它允许包装器脚本保持简单,并且不需要自定义操作来“破解”属性
  • 我目前倾向于选择3,尽管选择1可能是我最初问题的最佳答案。有什么想法吗?

    这就是它“应该”工作的方式-基本上,直到用户选中复选框,属性才存在,然后它被“设置”(存在)。因此,如果要在选中复选框时执行自定义操作,则需要测试属性是否存在,作为运行自定义操作的条件,而不是检查自定义属性设置为的值


    我认为从命令行处理此问题的最佳方法是您已经提到的:如果您希望选中复选框,请在命令行上指定自定义道具,否则,不选中,复选框将不会被选中。

    正如您所发现的,当定义属性时,复选框为true(选中)(非空)而为false(未选中)当属性未定义(空白)时。听起来您需要将环境1或0字符串转换为复选框true/false,其中1或0在命令行中传递。请尝试使用设置属性自定义操作,将属性设置为
    {}
    (空白),条件是属性已为
    “0”
    。在安装UI和安装执行序列中尽早安排


    延迟更新:关于需要多个自定义操作来处理多个复选框的问题,您有一个选择。您可以创建多个集合属性操作(好处:很容易知道它们在做什么;成本:很多),或者您可以创建一个基于代码的自定义操作,该操作将遍历属性列表,以将属性从
    0
    转换为空白(好处:一个操作;成本:文档记录不完整的自定义代码)。后一种方法的第二个优点是,您可以处理不寻常的
    值设置,例如选中复选框时应将属性设置为
    0

    我担心这一点。您提出的可能是唯一/最好的选择,但现在我的包装器脚本需要能够区分“复选框”属性和普通属性。如果“复选框”属性为0,则需要保留未指定的属性,但如果“普通”属性为0,它需要使用值0.Meh来指定它。我终于看到了您的更新,并提出了一个建议,以应对对许多set property操作的需要。但是,我更喜欢@Damien的建议在调用MSI的任何情况下处理此问题。设置属性={}确实会“取消定义”属性和用于复选框和其他类型的属性。我相信它可以从命令行和set-property自定义操作中工作。我相信
    {}
    在某种程度上特定于set-property操作,通常可能是MSI格式。在未应用格式的命令行中,可以使用
    PROPNAME=“”