2015-02-09 154 views
0

我从我们的wxs文件中得到以下代码片段。我需要了解为什么我们需要CustomAction SetInstallType通过CustomAction设置属性

我认为INSTALLATIONTYPE属性将从Registrykey中设置。因为它是一个公共属性,我想我也可以在运行msiexec时从命令行传递它。 我从commandLine发送的值会覆盖从注册表获得的值吗?

<Property Id="INSTALLATIONTYPE"> 
    <RegistrySearch Id='InstallType' Root='HKLM' Key='SOFTWARE\MyProduct\PR\ROOT' 
    Name='Configuration' Type='raw'/> 
</Property> 
<CustomAction Id="SetInstallType" 
Property="INSTALLATIONTYPE" Value="[INSTALLATIONTYPE.DEFAULT]"/> 
<InstallExecuteSequence> 
...... 
    <Custom Action="SetInstallType" After="AppSearch">INSTALLATIONTYPE.DEFAULT 
    </Custom> 
    ..... 
</InstallExecuteSequence> 

我试图从命令行传递的INSTALLATIONTYPE值喜欢INSTALLATIONTYPE=FULL但它被视为一个新的属性,而不是改变现有属性的值。

回答

1

AppSearch Action将读取注册表值并将其分配(在进程中覆盖)到您的属性,而不管它具有什么值。

诀窍是建立一个属性的优先级的模式:

最多到最少重要:

1)数值拾取在UI(如果浮出水面)

2)传递的值在命令行(如果提供)

3)从注册表检索(如果存在的话)值

4)默认值

UI序列 AppSearch - 读取注册表来临时变量 套装属性分配温度到最终如果最终空(NOT PROPERTY) 设置属性默认值到最终如果最终空(不是地产)

显示在UI .. 。如果用户更改值,最终属性将更新

执行序列 支持静默安装的相同流程。

+0

单独'RegistrySearch'是否足以搜索注册表值并将其分配给属性?如果我只有'RegistrySearch'是否提供了我在命令行提供的值覆盖它的值? – 2015-02-10 04:54:21

+0

'RegistrySearch'是一个抽象,不存在。它将行写入Appearch和Reglocator表中,然后由AppSearch操作进行处理。您在命令行传递的属性是初始值,然后被AppSearch覆盖。记录安装程序(msiexec/I foo.msi/l * v install.log),您将看到显示此情况的部分。 – 2015-02-10 11:58:26

+0

好的。当我进行管理安装时,我会在日志中看到这些吗? – 2015-02-10 13:22:36