2017-01-14 45 views
1

我已經使用Installshield 2014創建了一個MSI安裝程序。從UI運行它時一切正常,但是當我使用下面的命令以靜默模式運行它時,我的自定義操作根本沒有發射:如何在靜默模式下運行MSI安裝程序時運行自定義操作

C:\>msiexec /i "myApplication.msi" /qn WEBURL=http://localhost/mywebapp /log out.txt 

WEBURL是自定義操作所需的屬性。作爲參數傳遞給C#類庫方法的值爲WEBURL。 C#方法由我的自定義操作調用,在開始安裝嚮導步驟中單擊「安裝」按鈕時會調用該方法。我的自定義操作始終得到執行,即我將執行自定義操作的條件保存爲1,這意味着它在任何情況下都會執行。

在日誌文件中,我還看到WEBURL屬性獲取正確設置的值。我無法知道在靜默模式下運行安裝程序時會停止自定義操作的啓動方式嗎?

更新:如Michael所建議的,在將自定義動作置於InstallExecuteSequence之後,它開始以無聲模式執行。但現在問題在於它開始在UI模式下執行兩次,因爲通過點擊在InstallUISequence期間出現的對話框之一的按鈕已經執行了相同的動作。所以我想執行我的自定義操作,只有當我以靜默模式運行安裝程序時纔會將其設置爲InstallExecuteSequence(因此,如果我處於UI模式,它只會執行一次)。

回答

1

當您使用/qn運行時,嚮導不顯示。即使整個InstallUISequence被跳過。所以如果你想讓你的動作始終運行,你不應該僅僅通過點擊按鈕來調用它。當按鈕沒有顯示時,它不能被點擊。

取而代之的是在InstallExecuteSequence中找到一個位置來安排它。 (如果您沒有其他要求,則可能仍需要在CostFinalize之後的某個時間對其進行調度以反映非沉默情況。)無論您是否擁有UI,此調度都將運行該操作。

但是,無論您是安裝還是卸載,它都會運行它,因此無論是更改條件還是更改您的操作以將其考慮在內。最簡單的方法可能會檢查Installed屬性是否已設置;更強大的檢查可能會驗證相關組件的安裝和操作狀態。如果您需要在添加或刪除功能的維護方案中有條件地執行某些操作,則後者可能是必需的。

既然你提到你也需要它在UI期間運行,你必須採取額外的步驟。您可能可以設置msidbCustomActionTypeFirstSequence計劃選項,如下所示。

enter image description here

,或者您可能通過檢查UILevel,或通過設置,當你的操作運行檢查你自己的財產來檢測的情況下,例如。您可能還需要將其分成多個入口點,以便您可以從立即執行中告知UI;似乎沒有區分這兩者的RunMode。 (我是否忘記了設置的屬性?)

+0

如果我將自定義操作放在'InstallExecute'序列中,那麼它將以UI和靜默模式運行。在UI模式下,它會運行兩次,一次來自UI對話框之一,另一次來自「InstallExecute」序列。我無法從UI對話框中刪除它,因爲我可能必須根據一些UI檢查多次運行它。我如何確保即使我在「InstallExecute」序列中添加自定義操作,然後它僅在靜默模式下觸發*。 – RBT

+0

@RBT:我更新了我的答案,將FirstSequence和UILevel作爲僅在一個序列中執行的選項。 –

+0

自定義操作計劃選項爲我做了訣竅。我所有的自定義操作都按照「始終執行」進行安排。當我將它改爲「只執行一次」時,它開始按照我的預期工作。我相信'UILevel' thingy在我的場景中也可能是相關的,但我們在安裝程序INSTALLUILEVEL_FULL和INSTALLUILEVEL_NONE中只支持兩種模式。如果我在執行自定義操作時需要這種級別的控制權,我會使用它。我還添加了一個屏幕截圖,以展示您的帖子中的執行計劃更改,因爲它可以幫助讀者。感謝您的跟進。 – RBT

相關問題