我正在尝试安装具有以下条件的功能:“INSTALLTHIS =”YES“”。 “INSTALLTHIS”属性最初设置为“NO”。操作“test_command”也将“INSTALLTHIS”设置为“YES”。 “test_command2”中的消息框显示此属性的值已设置为“YES”。我希望“ProductFeature”会被安装,因为“INSTALLTHIS =”YES“”是真的,除非它没有安装。
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Product Id="*" Name="test" Language="1033" Version="1.0.0.0" Manufacturer="test_wix" UpgradeCode="351b96ea-a1af-4542-8be9-9e8e07878a99">
<Property Id="INSTALLTHIS" Value="NO" Secure="yes"></Property>
<Feature Id="ProductFeature" Title="SetupProject1" Level="0">
<ComponentRef Id="ClientSoftware" />
<Condition Level="1">
<![CDATA[INSTALLTHIS="YES"]]>
</Condition>
</Feature>
<CustomAction Id="test_command" Script="vbscript">
<![CDATA[
Session.Property("INSTALLTHIS") = "YES"
]]>
</CustomAction>
<CustomAction Id="test_command2" Script="vbscript">
<![CDATA[
MsgBox(Session.Property("INSTALLTHIS")) <!-- SAYS YES IN THE MESSAGE BOX -->
]]>
</CustomAction>
<InstallExecuteSequence>
<Custom Action="test_command" After="CostFinalize">NOT Installed</Custom>
<Custom Action="test_command2" After="test_command">NOT Installed</Custom>
</InstallExecuteSequence>
</Product>
(我删除了不必要的XML,如目录设置,ComponentGroup,Component)
答案 0 :(得分:2)
您遇到的问题主要是订购问题:在成本核算期间处理要素条件(特别是在CostFinalize操作期间)。成本计算完成后,它们没有进一步的效果。也就是说,我会避免以这种方式使用功能条件和级别,尤其是涉及Level="0"
时。 (Level =&#34; 0&#34;对于永远不会改变的事物,例如操作系统的位数,实际上是安全的。)
如果要允许用户通过传递命令行有条件地安装功能,请记录安装程序的功能。然后他们可以通过ADDLOCAL=list,of,features
。如果您希望在不更改功能的安装状态的情况下控制各个组件,则可以在组件上添加条件。但是这些也在成本计算期间进行处理,因此您仍需要注意测序。
作为旁注,请避免仅使用VBScript操作来设置属性。我认为这是对您的实际操作的简化,但如果不是,请使用SetProperty操作。 (我通常建议在所有情况下都避免使用VBScript操作,但更改更复杂的操作会带来更多困难,因此风险更大,因此您必须做出决定。)
答案 1 :(得分:1)
你要做的事情是不可能的。看看这个answer类似的问题。首先评估特征条件。在您的情况下,这意味着当评估特征条件INSTALLTHIS =&#34; NO&#34;。链接的答案提供了一个潜在的解决方案,虽然我没有使用这种方法,在我需要这种行为的安装程序中,我们的解决方案是从引导程序传递属性。