【问题标题】:How to set a check box to "unchecked" from the msiexec command line?如何从 msiexec 命令行将复选框设置为“未选中”?
【发布时间】:2011-02-28 20:07:18
【问题描述】:

我有一个 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)。建议使用构建后的 msi hack 作为解决方案。我想知道是否有人遇到过此问题并提出更好的解决方法/解决方案。谢谢!

更新

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

  1. 来自@Damien,让包装脚本在其值为 0 时不将属性传递给 msiexec。这会使脚本更加复杂,并且可能会阻止我覆盖默认为“已选中”的复选框的值”。
  2. 来自@Michael Urman,添加一个自定义操作,如果该属性的值为零,则清除该属性。这使得 msi 更加复杂,我必须为 UI 中的每个复选框添加这样的自定义操作。
  3. 另一个想法是简单地禁止在我们的 msi 安装程序中使用复选框,并使用单选框或下拉菜单来代替“真/假”问题。虽然这限制了我们安装程序的 UI 选项,但它可以让包装脚本保持简单,并且不需要自定义操作来“破解”属性。

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

【问题讨论】:

  • 我终于看到了你的更新,并且有一个建议来解决对许多 set-property 操作的需求。不过,我更喜欢@Damien 的建议,以便在调用 MSI 时处理这个问题。

标签: wix windows-installer


【解决方案1】:

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

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

【讨论】:

  • 我害怕那个。您提出的可能是唯一/最佳选择,但现在我的包装脚本需要能够区分“复选框”属性和普通属性。如果“复选框”属性为 0,则需要不指定该属性,但如果“普通”属性为 0,则需要将其指定为 0。嗯。
【解决方案2】:

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

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

【讨论】:

  • 设置一个属性 = {} 确实“取消定义”该属性并适用于复选框和其他类型的属性。我相信它适用于命令行和设置属性自定义操作。
  • 我相信 {} 有点特定于 set-property 操作,可能是一般的 MSI 格式。在不应用格式的命令行上,您可以使用PROPNAME=""
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 2011-08-15
  • 1970-01-01
相关资源
最近更新 更多