﻿# 如何利用 7-zip 設定自動解壓縮並解壓縮後自動啟動程式

我去年有弄一個 WinForm 的案子，案子完成後要給客戶安裝檔，程式還蠻簡單的，但除了主執行檔外，還有包括幾個相關的檔案，因為我不打算用 Setup Project 進行部署，而想直接做成「[綠色軟體](http://zh.wikipedia.org/w/index.php?title=綠色軟體&variant=zh-tw)」，讓程式點兩下即可自動進行解壓縮並執行程式。那時就決定用 [7-zip](http://7-zip.org/) 來實做，因為真的容易很多，以下是當時的筆記。

雖然可以透過 [7-zip](http://7-zip.org/) 做出內含解壓縮程式的執行檔，但透過介面最多只能做到將檔案壓縮而已，若要解壓縮後自動執行裡面的其中一個程式好像不行。

![7-zip: Add to Archive](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/a9329819bdae4db4af66-image_3.png)

若要做出可自動解壓縮並自動執行程式的話，必須使用 [SFX](http://en.wikipedia.org/wiki/Self-extracting_archive) 模組(module)才行，又因為我希望整個流程可以自動化，所以我打算用指令列(Command Line)的方式進行設定，並且整合到 Visual Studio 的建置流程(Build Process)中，整個過程完全自動化（ 建置 --> 壓縮 --> 製作成 SFX 執行檔 ）。

以下是設定的過程：

1\. 先到 [7-zip 下載頁](http://7-zip.org/download.html) 下載 7z Library, SFXs for installers, Plugin for FAR Manager 回來

![到 7-zip 下載頁下載 7z Library, SFXs for installers, Plugin for FAR Manager](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ed4f3f0798fe2cbe1bd8-image_9.png)

2\. 接著，你只要解壓縮 **7zr.exe** 與 **7zSD.sfx** 兩個檔案就可以了。其中的 Installer 目錄包含使用範例，看批次檔就大概知道怎麼做了。而我通常都把檔案解壓縮到 WinForm 專案的 bin 目錄下，之後我會將 Debug 或 Release 目錄整個壓縮起來即可。

![7-zip: 解壓縮 7zr.exe 與 7zSD.sfx 兩個檔案](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/9231f75615409deec0d6-image_12.png)

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** 程式。

![多奇資料庫管理系統](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/dc102ab675c1fd0c9f6b-image_15.png) ![64% Extracting](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/acc786dbb4bc2729d64b-image_18.png)

\---

以上的第4、第5個步驟可以寫成批次檔(Batch)，假設我命名成 **SFXDebug.bat**

接著再到 Visual Studio 中的 Project Property -> Build Events -> Post-build event command line 輸入以下指令：

![Visual Studio -> Project Property -> Build Events -> Post-build event command line](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/fb344e69da1cebedc282-image_21.png)

注意：由於該指令預設**開始位置**為專案建置的**輸出目錄**，所以我先用 **cd ..** 先跳到上一層目錄，再執行我的批次檔進行壓縮並產生 SFX 安裝程式，否則批次檔在執行的時候很容易會有找不到檔案的問題。

對於 SFX 的完整資訊可以下載 [7-Zip Command Line Version](http://downloads.sourceforge.net/sevenzip/7za464.zip) 後，裡面有個 **7-zip.chm** 說明檔，這裡會有相當詳細的說明。

![7-Zip Command Line Version :: 7-zip.chm Help file for SFX](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/1e9b4dcba1fcb65b6c7b-image_24.png)

**相關連結**

-   [7-zip](http://7-zip.org/)
-   [Self-extracting archive](http://en.wikipedia.org/wiki/Self-extracting_archive)
