如何从msiexec命令行设置"取消选中"复选框?

Stu*_*nge 7 windows-installer wix msiexec

我有一个msi(用WIX编写),它有一个绑定到自定义属性的复选框(称之为MY_PROPERTY).我想从命令行运行此msi,为此属性指定0(未选中)或1(已选中).我的脚本将确定适当的值(基于环境)并将该值注入msiexec命令行.我的命令行看起来像这样:

msiexec /i my_installer.msi MY_PROPERTY=$value
Run Code Online (Sandbox Code Playgroud)

其中$ value为1或0,具体取决于环境.问题是,无论我在命令行为MY_PROPERTY提供什么值,都会选中复选框(并且该属性将始终设置为1).取消选中复选框的唯一方法是不指定属性(保留未定义).应该注意,无论UI是否显示,都会出现这种情况(在上面的命令行中添加"/ quiet"不会改变这种行为).

这个msdn帖子似乎表明这是Windows安装程序中已知的"错误"(或者更确切地说,无论创作系统编写的是msi).建议使用post-build msi hack作为解决方案.我想知道是否有人遇到过这个问题并提出了更好的解决方法/解决方案.谢谢!

更新

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

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

我目前倾向于选项3,虽然选项1可能是我原来问题的最佳答案.有什么想法吗?

小智 8

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

我认为从命令行处理此问题的最佳方法是您已经提到的:如果您想要选中复选框,请在命令行中指定自定义prop,否则,请不要选中复选框.


Mic*_*man 5

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

延迟更新:关于需要多个自定义操作来处理多个复选框,您可以选择.您可以创建多个set-property操作(好处:很容易告诉他们正在做什么;成本:很多),或者您可以创建一个基于代码的自定义操作,该操作遍历Checkbox以获取要转换的属性列表从0空白到来(好处:一个动作;成本:记录不完整,自定义代码).后一种方法的第二个优点是您可以处理异常Value设置,例如应该0在选中时将属性设置为的复选框.