我有一个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>
然后解决方案是试图让条件如下? install = true reinstall = false uninstall = true – Neil
@Neil看起来像它。我会将upgrade = false添加到列表中:升级到更新版本的应用程序时,您希望保留这些文件。 –
@AlexeyIvanov不幸的是,这并没有工作,我设法得到它,所以我有两个属性INSTALLMODE和UNINSTALLMODE。运行升级时,它会卸载然后重新安装,两个属性都是错误的,但它仍然运行removefolderex部件并删除了所有内容。我想我将不得不承认失败,只是使用自定义的DLL操作来删除我需要的所有文件和文件夹。 – Neil