因為要做一個類似Windows Update的東西,以免程式更新時跑來跑去麻煩,雖然類似的工具很多,但是大都很複雜,於是決定自己做一個類似的簡單程式。
對比用戶端和伺服器端的程式版本,並把伺服器端新版本程式拷回來都好做(用VPN,相當於區域網路內檔案複製),但是安裝新版本程式就有問題了,因為Windows Installer安裝程式時如果發現有以前的版本就會要求你自己刪除舊版程式後再重新安裝,但我要實現的是自動卸載並安裝。直接運行msi檔案出錯,那我就穿參數,因為沒有找到相關資料就猜卸載應該是/u,啟動並執行時候沒有卸載來反倒是彈出來一個對話方塊,裡面有Windows Installer的參數設定介紹:Windows (R) Installer. V 3.01.4000.1830
msiexec /Option <Required Parameter> [Optional Parameter]
安裝選項
</package | /i> <Product.msi>
安裝或配置產品
/a <Product.msi>
管理安裝 - 在網路上安裝產品
/j<u|m> <Product.msi> [/t <Transform List>] [/g <Language ID>]
播發產品 - m 播發到所有使用者,u 播發到目前使用者
</uninstall | /x> <Product.msi | ProductCode>
卸載產品
顯示選項
/quiet
安靜模式,無使用者互動
/passive
無從參與模式 - 只顯示進程欄
/q[n|b|r|f]
設定使用者介面層級
n - 無使用者介面
b - 基本介面
r - 精簡介面
f - 完整介面(預設值)
/help
協助資訊
重新啟動選項
/norestart
安裝完成後不重新啟動
/promptrestart
提示使用者重新啟動(如果必要)
/forcerestart
安裝後總是重新啟動電腦
日誌選項
/l[i|w|e|a|r|u|c|m|o|p|v|x|+|!|*] <LogFile>
i - 狀態訊息
w - 非致命警告
e - 全部錯誤訊息
a - 操作的啟動
r - 操作特定記錄
u - 使用者請求
c - 初始介面參數
m - 記憶體不足或致命退出資訊
o - 磁碟空間不足訊息
p - 終端屬性
v - 詳細輸出
x - 額外調試資訊
+ - 擴充到現有記錄檔
! - 每一行重新整理到日誌
* - 記錄所有資訊,除了 v 和 x 選項
/log <LogFile>
與 /l* <LogFile> 相同
更新選項
/update <Update1.msp>[;Update2.msp]
應用程式更新
/uninstall <PatchCodeGuid>[;Update2.msp] /package <Product.msi | ProductCode>
刪除產品的更新
修複選項
/f[p|e|c|m|s|o|d|a|u|v] <Product.msi | ProductCode>
修複產品
p - 僅當檔案丟失時
o - 如果檔案丟失或安裝了更舊的版本(預設值)
e - 如果檔案丟失或安裝了相同或更舊的版本
d - 如果檔案丟失或安裝了不同版本
c - 如果檔案丟失或較驗和與計算的值不匹配
a - 強制重新安裝所有檔案
u - 所有必要的使用者特定登錄機碼(預設值)
m - 所有必要的電腦特定登錄機碼(預設值)
s - 所有現有的快鍵方式(預設值)
v - 從源運行並緩衝本機資料包
設定公用屬性
[PROPERTY=PropertyValue]
請查閱 Windows (R) Installer SDK 獲得有關
命令列文法的其他文檔。
著作權 (C) Microsoft Corporation. 著作權所有,並保留一切權利。
此軟體的部分內容系基於 Independent JPEG Group 的工作。
按這個傳參數試了好多次(我比較笨),終於成功了。下面把代碼貼出來,要安裝的程式名是Clock.msiusing System;
using System.Diagnostics;
public class mainTest
{
public static void Main()
{
// Windows Installer的命令為msiexec
ProcessStartInfo startInfo = new ProcessStartInfo("msiexec");
// 卸載程式的參數
startInfo.Arguments = string.Format("/uninstall Clock.msi");
Process p = new Process();
p.StartInfo = startInfo;
p.Start();
p.WaitForExit();
// 安裝程式的參數
startInfo.Arguments = string.Format("/i Clock.msi");
p.Start();
p.WaitForExit();
if (p.HasExited)
{
// 安裝完畢啟動新安裝的程式
startInfo = new ProcessStartInfo(@"C:\Program Files\Spider\Clock\Clock.exe");
p.StartInfo = startInfo;
p.Start();
}
}
}