我有一個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