SyntaxHighlighter

2013-05-24

利用7-Zip自製安裝程式打包

7-Zip越來越萬能了阿...


簡單流程如下:
1. 利用7-Zip將程式打包,產生.7z檔
2. 利用7z_extra裡面附屬的7zS.sfx或是7zSD.sfx設定檔產生自解並自動執行檔


相關工具
1. 當然是7-Zip自己啦
7-Zip 公式網站
http://www.7-zip.org/
SourceForge上的7-Zip檔案庫:
http://sourceforge.net/projects/sevenzip/files/7-Zip/

最新的9.22版的連結:

2. 7z_extra.7z追加套裝
7z_extra這個重要的套裝是沒有附在基本檔裡的,需要自己去下載來裝
不過在上面的SourceForge檔案庫裡有公開

以9.22版來說,這個追加檔案是7z922_extra.7z
http://sourceforge.net/projects/sevenzip/files/7-Zip/9.22/7z922_extra.7z/download


步驟1: 利用7-Zip將程式打包
建議使用無壓縮選項,以後再來壓縮就好= =
假如我們有檔案目錄ABC, 要把他打包的命令列指令就如下面所示
7z a ABC.7z ABC\*

步驟2.1準備設定檔
我們需要一個設定檔config.txt來告訴7z我們要怎麼對付調整這個自解檔的動作
config.txt必須是無BOM的UTF-8編碼
以「;!@Install@!UTF-8!」行開始,以「;!@InstallEnd@!」行結束。

ID_String
設定關鍵字串
Description
說明
Title 解壓縮時顯示訊息的標題
BeginPrompt 開始前詢問的字串
Progress 顯示解壓縮進度。可以設定為yes或是no。預設是yes
RunProgram 解壓縮後執行的指令。 預設值是"setup.exe"。子字串 %%T 將會被替代為解壓縮時臨時資料夾的路徑。
Directory RunProgram的資料夾前綴。預設值是".\\"。如果你的壓縮檔裡面又放了層資料夾,你就可以把資料夾名稱設定在此,那執行程式就會順利找到setup.exe檔
ExecuteFile 執行檔名
ExecuteParameters ExecuteFile的執行參數

以上指令並非全部必要。甚至你可以省略config.txt設定檔本身。

有兩種方式可以指定安裝程式:RunProgram或是ExecuteFile
用RunProgram來執行7z壓縮檔裡面的程式
用ExecuteFile來開啟7z壓縮檔裡面的文件檔或是呼叫外部程式來開啟7z壓縮檔裡面的檔案(例如.msi檔之類的)

以下是幾種config.txt的設定例:
;!@Install@!UTF-8!
Title="7-Zip 4.00"
BeginPrompt="Do you want to install the 7-Zip 4.00?"
RunProgram="setup.exe"
;!@InstallEnd@!
;!@Install@!UTF-8!
Title="7-Zip 4.00"
BeginPrompt="Do you want to install the 7-Zip 4.00?"
ExecuteFile="7zip.msi"
;!@InstallEnd@!
;!@Install@!UTF-8!
Title="7-Zip 4.01 Update"
BeginPrompt="Do you want to install the 7-Zip 4.01 Update?"
ExecuteFile="msiexec.exe"
ExecuteParameters="/i 7zip.msi REINSTALL=ALL REINSTALLMODE=vomus"
;!@InstallEnd@!

步驟3,把7z壓縮檔跟自解設定檔放在一起產生執行檔
我們剛剛說了需要7z_extra套件的理由來了
打開套件包,把裡面的7zS.sfx或是7zSD.sfx抓出來,把他放在跟7z壓縮檔同一個目錄中
7zS.sfx跟7zSD.sfx的差別是,一個使用靜態的程式庫連結,一個使用windows的MSVCRT.dll動態程式庫連結。
在命令列打下面的複製指令,把7zS.sfx, config.txt, ABC.7z套成一個ABC.exe自解檔

copy /b 7zS.sfx + config.txt + ABC.7z ABC.exe


大功告成!!

追加步驟:
如果你覺得無壓縮太大了不能承受,在製造7z檔的時候壓縮率加大一點,當然相對的解壓縮的時候會浪費比較多cpu資源跟記憶體。
如果檔案已經壓好了,可以用UPX之類的工具把他在壓過...當然,那又是另一段故事了...

0 件のコメント:

人気の投稿