我去年有弄一個 WinForm 的案子,案子完成後要給客戶安裝檔,程式還蠻簡單的,但除了主執行檔外,還有包括幾個相關的檔案,因為我不打算用 Setup Project 進行部署,而想直接做成「綠色軟體」,讓程式點兩下即可自動進行解壓縮並執行程式。那時就決定用 7-zip 來實做,因為真的容易很多,以下是當時的筆記。
雖然可以透過 7-zip 做出內含解壓縮程式的執行檔,但透過介面最多只能做到將檔案壓縮而已,若要解壓縮後自動執行裡面的其中一個程式好像不行。
若要做出可自動解壓縮並自動執行程式的話,必須使用 SFX 模組(module)才行,又因為我希望整個流程可以自動化,所以我打算用指令列(Command Line)的方式進行設定,並且整合到 Visual Studio 的建置流程(Build Process)中,整個過程完全自動化( 建置 --> 壓縮 --> 製作成 SFX 執行檔 )。
以下是設定的過程:
1. 先到 7-zip 下載頁 下載 7z Library, SFXs for installers, Plugin for FAR Manager 回來
2. 接著,你只要解壓縮 7zr.exe 與 7zSD.sfx 兩個檔案就可以了。其中的 Installer 目錄包含使用範例,看批次檔就大概知道怎麼做了。而我通常都把檔案解壓縮到 WinForm 專案的 bin 目錄下,之後我會將 Debug 或 Release 目錄整個壓縮起來即可。
3. 然後新增一個文字檔 config.txt ,這是設定 SFX for installers 在執行的時候的行為,包括解壓縮時要顯示什麼標題(Title)、是否要提示使用者按下確認後進行解壓縮(BeginPrompt)、或解壓縮後要自動執行哪支程式(RunProgram)、...等等。以下是設定檔範例(備註:檔案請使用 UTF-8 編碼存檔)
;!@Install@!UTF-8!
Title="多奇資料庫管理系統"
BeginPrompt="您要執行 多奇資料庫管理系統 嗎?"
RunProgram="Debug\多奇資料庫管理系統.exe"
;!@InstallEnd@!
4. 再來,就可以先透過 7zr.exe 程式將檔案壓縮成 7z 檔。
7zr.exe a Debug.7z Debug\
5. 最後一個步驟,就是將 7zSD.sfx、config.txt、以及 Debug.7z 三個檔案合併成一個可執行檔,我們可以利用 Windows 內建的 copy 指令搭配 /B 參數完成這三個檔案的合併動作。如下指令中,最後一個參數是最後要輸出的執行檔名稱。
copy /b 7zSD.sfx + config.txt + Debug.7z Debug.exe
此時,你只要執行 Debug.exe 就會出現以下畫面,在按下 是(Y) 之後就會立即執行解壓縮動作 (解壓縮到系統暫存目錄),並且在執行完後執行你在 config.txt 中定義的 Debug\多奇資料庫管理系統.exe 程式。
---
以上的第4、第5個步驟可以寫成批次檔(Batch),假設我命名成 SFXDebug.bat
接著再到 Visual Studio 中的 Project Property -> Build Events -> Post-build event command line 輸入以下指令:
注意:由於該指令預設開始位置為專案建置的輸出目錄,所以我先用 cd .. 先跳到上一層目錄,再執行我的批次檔進行壓縮並產生 SFX 安裝程式,否則批次檔在執行的時候很容易會有找不到檔案的問題。
對於 SFX 的完整資訊可以下載 7-Zip Command Line Version 後,裡面有個 7-zip.chm 說明檔,這裡會有相當詳細的說明。
相關連結