2011-04-14 64 views
8

我們爲我們的應用程序創建了WIX安裝程序。我們面臨的問題是: 我們已經定義了兩種不同的自定義操作(比如ActionForInstall和ActionForUninstall),我們希望在以下情況下執行: ActionForInstall:應該在安裝,產品升級,維護模式(用於修復和修改)時運行 ActionForUninstall :只能運行卸載。基於模式執行自定義操作 - WIX

但我們無法設置適當的條件。您可以參考代碼:

<Custom Action=ActionForInstall After='InstallFinalize' > 
    (NOT Installed) OR (Installed AND ((MaintenanceMode = "Modify") OR (MaintenanceMode = "Repair")) AND (NOT (MaintenanceMode = "Remove"))) OR ((UPGRADINGPRODUCTCODE) AND NOT(REMOVE ~= "ALL")) 
</Custom> 
<Custom Action=ActionForUninstall Before='InstallFinalize'> 
    Installed AND NOT UPGRADINGPRODUCTCODE 
</Custom> 

請讓我們知道我們做錯了什麼。上面的代碼甚至調用InstallFinalize進行卸載。

+1

有用速查表:http://www.flexerasoftware.com/webdocuments/PDF/IS-CHS-Common-MSI-Conditions.pdf。我喜歡通過將NOT PATCH添加到現有條件列表以及禁用UPGRADINGPRODUCTCODE來禁用它們以進行主要升級,從而禁用MSI修補程序運行的自定義操作。 – 2014-05-28 00:37:01

回答

10

您可以嘗試以下條件:

ActionForInstall:使用產品級特性,如不安裝

REMOVE <> "ALL" 

ActionForUninstall

REMOVE = "ALL" 
+0

根據自定義操作的安排位置以及如何執行卸載,REMOVE =「ALL」條件可能會失敗。例如,當執行/ x卸載時,REMOVE屬性將立即設置。但是,在執行維護操作並選擇卸載時,REMOVE屬性在成本覈算之後纔會設置。只是要注意的事情。我仍然認爲,根據組件狀態創建條件會更好。 – 2011-04-14 11:24:03

+0

@christopher你有......但是我們時間緊,我們沒有任何wix專家..你在說什麼可能需要更多的努力來理解和實施..所以我們使用@Cosmin給出的解決方案 – vrajs5 2011-04-15 04:49:44

+0

查看我的評論添加到上述關於主要升級和補丁安裝的問題中。這些安裝類型使用與主要安裝,維護和卸載相同的安裝順序。將自定義操作設置爲在這些安裝類型期間不運行通常是有益的。 – 2014-05-28 00:42:47

5

一般條件和REMOVE = 「ALL」 唐」達到您的預期。一般來說,最好使用組件動作狀態,例如

$組件名= 3 < - 組件被安裝在本地

$組件名= 2 < - 組件以前安裝,目前正在移除

這通常會涵蓋您的所有安裝,卸載,維護,修復,升級方案。

您可以使用「&」操作符爲功能做類似的事情,但通常使用組件「$」更好,因爲組件是物理的,並且可以關聯到一個或多個只有邏輯的功能。

如果您真的想將它提升到下一個級別,您的自定義操作可以(應該)使用外鍵連接到Component表進行數據驅動。在這種情況下,您的自定義操作總是觸發,然後查詢表並評估組件操作狀態以決定需要安排哪些操作。

Conditional Statement Syntax (Windows)