安装MSP补丁后,Windows Installer决定安装初始MSI中提供的所有功能。如何防止MSP补丁安装所有可用功能?
功能请求显示如下:
Installed: Absent
Request: local
Action : local
为什么要求安装所有?
答案 0 :(得分:1)
我发现ADDLOCAL属性已设置为所有已卸载的功能。这导致每个人“请求:本地”。我为解决这个问题所做的是使用一个删除此属性的小型自定义操作。它需要在CostFinalize之前运行,因为需要在该操作之前定义要安装的功能。 变量REINSTALL保存已安装的功能,并且所有功能都要求重新安装。因此,MSP补丁仅重新安装已安装的功能,并保持未安装的功能不受影响。
<CustomAction Id="REMOVE_ADDLOCAL_PROPERTY"
Property="ADDLOCAL" Value="[NonExistentProperty]"
/>
<InstallExecuteSequence>
<Custom Action="REMOVE_ADDLOCAL_PROPERTY" Before="CostFinalize">
<![CDATA[PATCH]]>
</Custom>
</InstallExecuteSequence>
编辑: 最后,这个解决方案适用于我的一个补丁,但另一个失败了。所以我到目前为止实现的最终解决方案是在补丁期间设置REINSTALL = ALL。This MSDN link代表:
请注意,即使将REINSTALL设置为ALL,也只会重新安装之前已安装的功能。因此,如果为尚未安装的产品设置了REINSTALL,则根本不会执行任何安装操作。
所以我认为这是一个比删除ADDLOCAL
属性更好的解决方案。它也适用于两个补丁。
答案 1 :(得分:0)
初始安装ADDLOCAL
属性时,必须将所选功能保存到注册表中。安装补丁时,必须相应地从注册表设置ADDLOCAL
属性中读取状态。
否则,补丁会像选择默认值一样运行,因此会安装缺少的功能。
您链接到a question升级案例,MigrateFeatures
属性(引用MigrateFeatureStates
action)在补丁的情况下不起作用。