我有一个MSI(由WIX撰写),该复选框绑定到自定义属性(称其为my_property)。我想从命令行中运行此MSI,为此属性指定0(未选中)或1(检查)。我的脚本将确定适当的值(基于环境),并将该值注入MSIEXEC命令行。我的命令行看起来像这样:

msiexec /i my_installer.msi MY_PROPERTY=$value

$ value是1或0,具体取决于环境。问题在于,无论我在命令行中为my_property提供什么值,始终检查复选框(属性将始终设置为1)。使复选框不受控制的唯一方法是不指定属性(将其保留未定义)。应该注意的是,无论UI是否显示(在上面的命令行中添加“/letim”)不会改变此行为)。

这个MSDN帖子 似乎表明这是Windows Installer中的一个已知“错误”(或更准确地说,任何创作系统编写了MSI)。提出了后构建的MSI黑客攻击作为解决方案。我想知道是否有人遇到了这个问题,并提出了更好的解决方法/解决方案。谢谢!

更新

我看到了这个问题的三个解决方案:

  1. 从@Damien中,让包装器脚本在其值为0时不会将属性传递给MSIEXEC。这使脚本更加复杂,并且可能会阻止我能够覆盖默认为“检查”的复选框的值。
  2. 从@michael Urman添加一个自定义操作,如果其值为零,则可以清除该属性。这使MSI更加复杂,我必须为UI中的每个复选框添加这样的自定义操作。
  3. 另一个想法是简单地禁止在我们的MSI安装程序中使用复选框,然后将收音机框或下拉框用于“ true/false”问题。尽管这限制了我们的安装程序的UI选项,但它允许包装器脚本保持简单,并且不需要自定义操作来“破解”属性。

我目前倾向于选项3,尽管选项1可能是我原始问题的最佳答案。有什么想法吗?

有帮助吗?

解决方案

这就是“假定”工作的方式 - 基本上,在用户选中复选框之前,该属性不存在,然后是“设置”(存在)。因此,如果您想在选中复选框时执行自定义操作,则测试属性的存在作为运行自定义操作的条件,而不是检查自定义道具所设置的值。

我认为从命令行处理此操作的最佳方法是您已经提到的:如果您希望选择复选框,请在命令行上指定自定义道具,否则,请勿和复选框。

其他提示

当您发现的情况下,当定义属性(非空白)和错误(未选中)属性时,复选框是真实的(已检查)。听起来您需要将环境1或0字符串转换为true/false的复选框,其中1或0在命令行中传递。尝试使用将您的属性设置为的Set-Property自定义操作 {} (空白)有何时已属性的条件 "0". 。在安装UI和安装执行序列的早期安排。

后期更新: 关于需要多个自定义操作来处理多个复选框的需要,您可以选择。您可以创建多个Set-Property操作(好处:易于告诉他们在做什么;成本:其中许多),或者您可以创建一个基于代码的自定义操作,该操作行走 Checkbox 桌子 对于要转换的属性列表 0 空白(受益:一项操作;成本:记录不足,自定义代码)。后一种方法的次要优势是您可以处理异常 Value 设置,这样的复选框,该复选框应将属性设置为 0 检查时。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top