Windows Installer的簡單應用

哈哈哈哈哈我撒發表於2010-11-12

   因為要做一個類似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.msi
using 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();
        }

    }

}

相關文章