Windows Installer的簡單應用
因為要做一個類似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.msimsiexec /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 的工作。
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();
}
}
}
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();
}
}
}
相關文章
- Nginx 簡單應用(Windows os)NginxWindows
- websoket的簡單應用Web
- npm的簡單應用NPM
- windows installer出錯Windows
- jsp的簡單應用JS
- 遞迴的簡單應用遞迴
- rename命令的簡單應用
- thymeleaf 簡單應用
- div 簡單應用
- ajax簡單應用
- smbclient 簡單應用client
- Tomcat windows service InstallerTomcatWindows
- pythontornodo的簡單應用1Python
- jQuary中ajax的簡單應用
- gRPC的Golang簡單應用RPCGolang
- @Autowire/@Qualifilter/@Resource的簡單應用Filter
- 並查集的簡單應用並查集
- Android ExpandableListView的簡單應用AndroidView
- 簡單的線段樹應用
- appfabric 簡單應用APP
- ORACLE簡單應用 (轉)Oracle
- 一個簡單的iptable的應用
- Disruptor的簡單介紹與應用
- 簡單計算器(棧的應用)
- 簡單易用的macOS音量應用程式Mac
- arguments的應用示例簡單介紹
- libssh2的簡單應用
- 簡單的Java二維碼應用Java
- Rust GUI庫 egui 的簡單應用RustGUI
- 一個簡單的 indexedDB 應用示例Index
- C#反射的Assembly的簡單應用C#反射
- 快應用簡單瞭解
- MapReduce應用案例--簡單排序排序
- 用 Vue 建立一個簡單的 electron 桌面應用Vue
- 使用 Flutter 開發簡單的 Web 應用FlutterWeb
- JWT在專案中的簡單應用JWT
- Fresco圖片載入的簡單應用
- webpack-dev-server最簡單的應用WebdevServer