2011-11-24 71 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