2011-04-27 221 views
3

我有一個內置的MSI放置在網絡驅動器上,我想寫一個登錄腳本,以便我們網絡上的任何人都可以將MSI安裝到他們的機器上,或者在MSI更新時(通常會發生這種情況)讓它自動重新安裝。如何讓msiexec根據需要安裝和/或重新安裝

如果我使用msiexec.exe /i REINSTALL=ALL,如果MSI尚未安裝在該機器上,它將不會執行任何操作。如果我忽略了REINSTALL=ALL,那麼它會進行全新安裝,但不會更新/重新安裝。

如果軟件包還沒有安裝,我應該選擇什麼參數進行全新安裝,並且如果軟件包已經安裝,應該完全重新安裝嗎?

首先運行msiexec /i然後重新安裝可能會起作用,但如果可能,我想避免這種情況。

編輯:/famus需要的原因是這些是開發者機器,有人可能會手動更新註冊表或註冊一組不同的dll。該腳本的意圖是,即使沒有任何MSI的變化,開發人員也可以運行腳本輕鬆地恢復到「官方」環境。

回答

2

我最後用一個運行msiexec/famus的批處理文件解決了它,如果退出代碼是1605,它將運行msiexec/i。

3

關於嘗試什麼:
msiexec /i <path to msi> ADDLOCAL=<top level feature name>

您可以通過在Orca.exe的打開包裝來看,在功能表中獲取頂級功能(S)。

1

一種常見的做法在一個點上,以支持次要升級是筆者在包REINSTALL=ALL,但然後添加一個type 51 (set property) custom actionREINSTALL={}清除屬性時,你的產品是NOT Installed。我不確定這正是你想要的,但它可能是一個開始。如果你沒有創建這個包,你可以添加一個轉換屬性和清除動作:msiexec.exe /i [...] TRANSFORMS="[...]\reinstall.mst"

1

我會使用重大升級而不是次要升級。對於主要升級,命令行將始終保持不變 - 無需使用不同的命令行,具體取決於是升級還是全新安裝。

重大升級實際上是完全獨立的設置,通過升級表中指定的邏輯鏈接告訴Windows安裝程序應如何執行「升級」。升級根本不是升級,而是卸載現有產品並安裝新產品。

升級表有一條學習曲線,有時候會有些希臘語,但它在指定升級行爲時有很大的靈活性。部分樣本:

  • 您可以卸載舊產品,並安裝新的
  • ,您可以禁止安裝一個較舊的產品之上更新的一個
  • 可以允許降級一個新與舊的安裝一個正在運行(例如,以確保您在登錄腳本中獲得的版本是目標系統上的版本)

主要升級還有一些額外的挑戰會使事情混淆。特別是主要升級允許新版本的安裝先於舊版本的卸載!這種情況下需要正確完成組件引用的無錯設置。然而,最常見的方法是徹底卸載舊版本,然後安裝新版本。這種方法更寬容,即使設置中的組件引用已被搞亂,該方法通常也能正常工作。

就我個人而言,我從來沒有使用小的升級任何東西,只是對公開發布的軟件進行微小的調整。我發現這些升級極易出錯,部署繁瑣,耗時調試和質量保證以及通常不必要的複雜性。如果主要升級因先前軟件包的卸載邏輯錯誤而失敗,我也會使用它們。換句話說,當我需要在可以正確卸載之前先修復有問題的安裝。

+0

是的,我們正在使用主要升級作爲其內部「官方」使用的一種。我只是在問題中添加了一個編輯,提及需要修復/系統才能將機器恢復到正式設置,因此即使沒有升級到MSI也必須運行。 – Ying 2011-04-28 01:05:59