我有以下财产:
<Property Id="UPDATEDB">1</Property>
UI 中绑定到该属性的复选框:
<Control Id="updateDatabase" Type="CheckBox" CheckBoxValue="1" Height="15" Width="95" X="20" Y="74" Text="Update Database" Property="UPDATEDB" />
还有一个自定义操作,它根据此属性的值执行某些操作
<CustomAction Id="RunDbMigration" Directory="INSTALLDIR" Return="check"
ExeCommand='[DBMIGRATIONDIR]\DbMigration.exe' />
<InstallExecuteSequence>
<Custom Action="RunDbMigration" After="InstallFinalize">UPDATEDB=1 AND NOT Installed</Custom>
</InstallExecuteSequence>
如果我尝试从命令行为 UPDATEDB 传递 0 值:
msiexec /i "Setup.msi" /l* UPDATEDB=0
或
msiexec /i "Setup.msi" /l* UPDATEDB="0"
无论如何,复选框的值都会被选中。也就是说,传入的 0 似乎受到尊重,并且 RunDbMigration 操作未运行...
这是怎么回事?为什么这是如此火箭科学?
正如其他人提到的,复选框不是 1/0 意义上的布尔值,而是 null/not-null 意义上的布尔值。
要从命令行取消设置 - 您需要使用类似的东西
msiexec /i "Setup.msi" /l* UPDATEDB=""
您的条件很可能在执行自定义操作之前专门查找 1 的值,这就是您的 CA 未运行的原因。
安装程序属性要么设置为一个值,要么不设置。在内部,该值只是一个字符串,因此“0”、“1”、“true”和“false”是相同的。
当复选框控件的属性设置为某个值(无关紧要)时,复选框控件将被选中;当其属性为空时,复选框控件将被取消选中。
此命令行设置属性并选中复选框:
msiexec /i "Setup.msi" /l* UPDATEDB="0"
此命令行不设置属性,因此未选中该复选框:
msiexec /i "Setup.msi" /l*
问题是 CheckBoxValue="1"。您可以在这里找到问题的解决方案:https://wix-users.narkive.com/HOW67H18/how-to-conditionally-check-uncheck-a-checkbox