2011-11-24 70 views
1

我有一个util:RemoveFolderEx元素,我只想在程序卸载时运行。我把它放在它自己的组件中,然后在一个属性上设置一个条件,以确定它是否应该包含在内。Wix:财产状况不起作用

任何人都可以向我解释为什么以下不起作用?

<Property Id='UNINSTALLMODE' Value="FALSE"></Property> 

<DirectoryRef Id="DATADIR">   
    <Component Id="C.RemoveDataFolder" Guid="myguid" KeyPath="yes"> 
     <util:RemoveFolderEx On="uninstall" Property="DATADIR" ></util:RemoveFolderEx> 
     <Condition>(UNINSTALLMODE="TRUE")</Condition> 
    </Component> 
</DirectoryRef> 

<CustomAction Id="CA.SetUninstallMode" Property="UNINSTALLMODE" Value="TRUE" /> 

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

我检查了日志,并且在卸载软件时,自定义操作正确地将UNINSTALLMODE设置为“TRUE”。在安装并重新安装它是“FALSE”。我已经尝试了与RemoveFoldersEx相关的计划Before =“WixRemoveFoldersEx”和Before =“CostInitialise”的自定义操作。

任何帮助非常感谢,这是让我疯狂!尼尔


编辑:我的WiX的更新,这

<Property Id='P.INSTALLMODE' Value='0'></Property> 
<Property Id='P.UNINSTALLMODE' Value='0'></Property> 

<DirectoryRef Id="DATADIR">   
    <Component Id="C.RemoveDataFolder" Guid="myguid" KeyPath="yes"> 
     <util:RemoveFolderEx On="uninstall" Property="DATADIR" ></util:RemoveFolderEx> 
     <Condition>(P.INSTALLMODE = 1) OR (P.UNINSTALLMODE = 1)</Condition> 
    </Component> 
</DirectoryRef> 

<CustomAction Id="CA.SetInstallModeToTrue" Property="P.INSTALLMODE" Value='1' /> 
<CustomAction Id="CA.SetUninstallModeToTrue" Property="P.UNINSTALLMODE" Value='1' /> 

<InstallExecuteSequence> 
    <RemoveExistingProducts Before="InstallInitialize" />    

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

的DATADIR值从注册表和CostInitialize前仔细阅读后,自定义操作运行。

这里是在以下情况下会发生什么

  • 安装 - >条件得到满足,并安装该组件
  • 重新安装 - >条件没有被满足,但该组件仍卸载,然后重新安装
  • 卸载 - >条件得到满足,组件被卸载

我可以从中获得的所有条件是条件只适用于安装p一旦安装了组件,就不可能对其进行删除。


EDIT2:通过使用其通过自定义操作设置removefolderex属性终于拿到这个工作。现在看起来很简单。

<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> 

回答

2

安装时,组件的条件(包含RemoveFolderEx元素)为False。这意味着组件未安装。如果没有安装,它显然也不会被卸载。因此,即使卸载时条件驱动属性为True,CA也不会运行,因为它所依赖的组件未安装。

+0

然后解决方案是试图让条件如下? install = true reinstall = false uninstall = true – Neil

+0

@Neil看起来像它。我会将upgrade = false添加到列表中:升级到更新版本的应用程序时,您希望保留这些文件。 –

+0

@AlexeyIvanov不幸的是,这并没有工作,我设法得到它,所以我有两个属性INSTALLMODE和UNINSTALLMODE。运行升级时,它会卸载然后重新安装,两个属性都是错误的,但它仍然运行removefolderex部件并删除了所有内容。我想我将不得不承认失败,只是使用自定义的DLL操作来删除我需要的所有文件和文件夹。 – Neil