如何将 WiX 属性默认为 null?

dsp*_*egs 4 installation windows-installer wix

我正在开发一组将共享通用表单的 WiX 安装程序。每个应用程序都需要设置这些值,但每个应用程序的值都不同。

我试图允许属性(链接到控件)具有默认值(或不具有默认值),并允许通过命令行设置属性值。

在我的“SharedDialog.wxs”中我有:

<Fragment>
   <PropertyRef Id="PROP1"/>
   <PropertyRef Id="PROP2"/>
   <UI>
      <Dialog Id="SharedDialog" Width="370" Height="270" Title="[ProductName]">
         <Control Type="Edit" Id="1" Property="PROP1" Wid... Indirect="no" />
         <Control Type="CheckBox" Id="2" Property="PROP2" Wid...  
           CheckBoxValue="1" Indirect="no"/>
      </Dialog>
</Fragment>
Run Code Online (Sandbox Code Playgroud)

在应用程序特定项目的文件中:

<Fragment>
   <Property Id="PROP1" Value="Test"/>
   <Property Id="PROP2" Value="1"/>
</Fragment>
Run Code Online (Sandbox Code Playgroud)

这一切都适用于我想要做的事情,但问题是当我想像这样清除值时:(所以它们没有默认值)

<Fragment>
   <Property Id="PROP1"/>
   <Property Id="PROP2"/>
</Fragment>
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Unresolved reference to symbol 'Property:PROP1' in section 'Fragment:'. 
Unresolved reference to symbol 'Property:PROP2' in section 'Fragment:'.
Run Code Online (Sandbox Code Playgroud)

WiX 也不会让您将值设置为“”。问题是,据我所知,如果该属性具有值,则该复选框将始终被选中。如何将属性“PROP2”设置为“null”?

Ste*_*mul 5

  • 您可以通过将现有属性设置为等于用大括号括起来的空字符串来取消定义,如下所示:在设置属性自定义操作中的 PROPERTY = {} 。这意味着该属性不存在,它不是空字符串。请参阅此处的解释
  • 对于可从命令行使用的属性,它们必须是 PUBLIC - 它们是全部大写的属性。
  • 将公共属性设置为安全意味着它们可以从客户端传递到服务器安装过程,这是延迟模式自定义操作中使用的属性所必需的。从技术上讲,这会将它们添加到SecureCustomProperties列表中。
  • 您可以在属性表中为 PUBLIC PROPERTIES 指定默认值,然后从命令行设置其他值。命令行覆盖默认值:

    msiexec.exe /I "C:\Test.msi" /QN /L*V "C:\log.log" TEST="MyValue" TEST2="MyValue"

查看更多信息: 如何从 msiexec 命令行将复选框设置为“未选中”?