Wix:是否可以从自定义操作中手动运行RemoveFolderEx元素?

时间:2011-11-24 22:56:23

标签: wix windows-installer

我想知道是否可以从自定义操作中手动运行RemoveFolderEx元素。我猜可能不是,但有人可能知道一种我不知道的方式。

我的问题是我想运行RemoveFolderEx元素,但仅在真正的UNINSTALL上运行,但是我的程序在升级时执行它,因为我在重新安装之前将其设置为uninstall。

我通过这种方法尝试过 Wix: condition on property not working 但它在重新安装时无法正常运行。

我唯一能想到的是能够从自定义操作中手动设置RemoveFolderEx,我知道我在正确的位置运行并且仅在真正的卸载时运行。也许我的自定义操作可以使用c ++ dll,然后手动将命令添加到MSI接口,但如果我走得那么远,也可以自己完全编写删除逻辑。

感谢。尼尔


编辑:我终于有了这个工作,这里有一些示例wix来展示我的所作所为。

<Property Id='P.REMOVEDATAFOLDER' Secure='yes' />

<DirectoryRef Id="DATADIR">        
    <Component Id="C.RemoveDataFolder" Guid="myguid" KeyPath="yes">
        <util:RemoveFolderEx On="uninstall" Property="P.REMOVEDATAFOLDER" />
    </Component>
</DirectoryRef>

<CustomAction Id="CA.SetDataFolder" Property="P.REMOVEDATAFOLDER" Value='[DATADIR]' />

<InstallExecuteSequence>           
    <Custom Action="CA.SetDataFolder" Before="ValidateProductID" >(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>
</InstallExecuteSequence>    

在从注册表中读取DATADIR但在CostInitialize操作之前,属性P.REMOVEDATAFOLDER 立即设置为真正的卸载。

2 个答案:

答案 0 :(得分:5)

我会使用以下方法。不要调整RemoveFolderEx操作,而是使用条件自定义操作为目标属性设置适当的值。

答案 1 :(得分:0)

this question获得一些建议,表示卸载的条件为REMOVE="All" AND NOT UPGRADINGPRODUCTCODE

这样的事情可能有用:

<Component Id="RemoveMyFolder">
  <Condition> REMOVE="All" AND NOT UPGRADINGPRODUCTCODE </Condition>
  <RemoveFolderEx ... />
</Component>