原文連接:http://teach.hanzify.org/article/652-1233562028.html php
前言 html
最近有漢化朋友問起如何不從新制做MSI文件,而直接用漢化好的文件替換MSI安裝程序中的文件。爲此,將本人的實踐經驗做個總結,供各位漢化人蔘考。有錯誤的地方煩請指正。
※說明:
目前能夠用於MSI編輯的軟件不少,可是有些軟件在保存時會在MSI文件中寫入一些本身的表或內容,有些會另外嵌入一個CAB文件,使得MSI文件增大。而這裏提供的方法保證不會寫入任何沒必要要的內容和文件。
※關鍵點:
一、CAB中的文件順序要和MSI的文件表中的文件順序保持一致。
二、有些CAB中的文件使用了Windows不支持的文件名。 數據庫
軟件準備 express
一、Orca,微軟提供的MSI編輯器。漢化版下載地址(版本爲 4.5.6001.22192):
http://www.hanzify.org/index.php?Go=Show::List&ID=11122 或
http://www.wanfutrade.com/software/hanhua/Orca45chs.msi
二、MsiDb,微軟提供的MSI中CAB文件提取和替換工具。本人的漢化版下載地址(版本爲4.5.6001.22192):
http://www.wanfutrade.com/software/hanhua/MsiDb.exe
三、IExpress,微軟提供的CAB文件打包用戶界面工具。本人的漢化版下載地址(版本爲6.0.3790.0):
http://www.wanfutrade.com/software/hanhua/iexpress20.exe
四、Excel,相信這個你們都有吧。什麼版本均可以。 編輯器
基礎知識 函數
一、MSI文件的格式
MSI文件實際上一個安裝數據庫,裏面有不少表,這些表都是由 TAB 格式寫成的文本,就像EXCEL同樣由列和行組成。能夠從MSI中導出每一個表。導出的表能夠用文本編輯器和EXCEL打開。至於每一個表和表中每一個字段的做用就不在這裏講述了。請參考微軟提供的相關資料。
二、MSI安裝文件存在形式
MSI 安裝程序中,須要安裝的文件的存在形式許多種,常見的有如下幾種:
(1)安裝文件被打包爲CAB文件,並嵌入在MSI文件中
(2)安裝文件被打包爲CAB文件,但CAB獨立於MSI存在
(3)安裝文件未被打包爲CAB文件,而是以原來的狀態存在於各個文件夾中
對於以(1)、(2)形式存在的CAB文件,能夠採用本文介紹的方法替換,而對於以(3)形式存在的文件文件直接替換便可。
三、MSI安裝文件列表
在MSI文件中有二個表是用來表達CAB中的文件列表和CAB文件的名稱和文件數以及其餘信息的,這就是 File 表和 Media 表,其中File表保存了CAB中存在的文件名以及每一個文件所屬的組件、安裝後的實際文件名、文件大小、版本、語言、屬性和文件順序等信息,Media表保存了CAB文件的磁盤ID、文件數、磁盤描述、CAB文件名以及卷標等信息。
先來看一下MSI文件中這二個表:
(1)File表
上面就是File表,對涉及到本主題的列說明以下:
File列,表示 CAB中的文件名列表,有的是咱們常見的文件名格式,有的則在常見文件名後加上許多像類 ID那樣的編號,有的乾脆就是一個編號。對爲何不用常見的文件名,我想是因爲有的MSI製做軟件爲了某種目的故意這樣命名的。特別是InstallShield製做的MSI文件。
Compoent_ 列,表示該文件屬於哪一個組件。
FileName 列,表示安裝後的文件名。其中 | 前面的爲短文件名,後面的爲長文件名。
FileSize 列,表示文件的大小。通常不須要更改它,即便替換後的文件與其不一致。
Language 列,表示文件所用的語言。通常也不須要更改它,即便替換後的文件語言與其不一致。
Attributes 列,表示文件的屬性,好比隱藏、系統、存檔等等。通常也不須要更改它,除非您有特別的用途,如想在安裝後隱藏某個文件。
Sequenec 列,表示文件的序號,這裏的須要不容許重複,而且始終是從1開始的。
(2)Media表
Media表中,DiskID、DiskPrompt、VolumeLable、Source列通常不須要去考慮,這裏主要介紹如下其餘二個列。
LastSequence 列,表示CAB中的文件數,也就是上述File表中Sequenec 列中的最大數,這二個數必定要一致。
Cabinet 列,表示 CAB文件名。注意:文件名前的「#」不是真正文件名的一部分。 工具
開始實踐 post
一、首先提取嵌入在MSI中的CAB文件。若是是CAB文件獨立於MSI,跳過該操做。
在DOS下或MsiDb.exe快捷方式下,使用「MsiDb.exe –x CAB文件名 -d MSI文件名」命令提取。
其中:(1)CAB文件名就是Media表中的Cabinet 列中的CAB文件名。注意忽略前置的「#」。
(2)CAB 和 MSI 文件名均要帶後綴擴展名。
二、直接用Windows 資源管理器或RAR或其餘壓縮軟件提取CAB文件中的文件到一個單獨的文件夾。
三、使用CMD命令,轉入DOS界面,在釋放CAB中的文件的單獨文件夾下,使用「dir /b > CabFileList.xls」命令提取該文件夾中的文件名列表。這裏的CabFileList.xls文件名您能夠用其餘文件名代替,自由命名。
四、用MsiDb.exe或Orca打開MSI文件,導出MSI文件中的File表。導出後的文件名爲File.idt。
五、用EXCEL打開File.idt文件,並按 Sequenec 列對整個表進行排序備用。以下圖。
六、比較從CAB中提取的文件數量是否與MSI文件中的File表中所列的文件數量相等。能夠直接在MSI文件和解開的文件夾中判斷,也能夠用EXCEL分別打開前面生成的CabFileList.xls和File.idt進行判斷。
(1)若是相等,通常狀況下說明文件名都是相同的。
(2)若是不等,說明CAB中的某些文件有Windows 系統不承認的文件名存在,好比CAB中有XXX.(注意XXX後面的 . )這樣的文件名。
在不相等的狀況下,用EXCEL分別打開前面生成的CabFileList.xls和File.idt二個文件,分別對文件名列進行排序,並將File.idt文件的文件名所在列整列複製到CabFileList.xls中的一個新列中,並用IF函數判斷兩者是否有差別。如圖所示(注意Msi_FileTable_FileList列中後面帶 . 的文件)。
七、在提取的文件夾中,將在有差別的文件的文件名後添加一個數字或其餘什麼,將其更名,而後再從CAB文件中提取有差別的文件的另外一個文件。
八、在CabFileList.xls中插入一個工做表,將第5步中已排序的File.idt 文件的File列和Sequenec 列分別複製到新的工做表中,並在其餘列中添加「FILE」、「"」、「=」等列,而後用CONCATENATE文本合併函數,將這些列中的數據合併成IExpress所需的腳本格式。如圖所示。
九、用漢化好的文件替換已解開的文件(注意:第六、7步中有差別的文件)。
※推薦直接漢化已解開的文件,以避免從新命名等麻煩。
十、運行IExpress,選擇「僅建立壓縮文件」選項(如圖),將已用漢化替換的文件所有或部分添加到要打包的文件中,而後選擇「在軟件包中使用長文件名保存文件」選項,最後保存好.SED擴展名的IExpress腳本文件。
十一、修改IExpress腳本文件。用文本編輯器打開剛纔保存的IExpress腳本文件(.sed),並從第8步的EXCEL表中複製SED[Strings] 列到IExpress腳本文件的 [Strings] 節中,同理,複製SED[SourceFiles0] 列到 [SourceFiles0] 節。
※重要提示:
若是第六、7步中有差別文件存在,請在IExpress腳本文件的 [Strings] 節中,將有差別的文件按MSI文件中的文件名命名(在第8步中已經採用了MSI中的文件名列表,因此這裏通常不須要修改)。並將IExpress腳本文件的 [SourceFiles0] 節中的文件名所有改成在資源管理器中存在的實際文件名。
※備註:
(1)在通常的IExpress腳本文件(.sed)的[SourceFiles0] 節中的「=」號後是沒有文件名的。由於有差別文件名存在,因此這裏須要特別處理。
(2)建立CAB時,程序會自動刪除[SourceFiles0]節中的全部文件名。請注意保存備份,並在下次建立時複製回去。
十二、再次運行IExpress,打開剛纔修改好的IExpress腳本文件,一路下一步,一個已用漢化後文件替換的符合MSI文件中的File表的文件順序的新CAB文件生成了。
1三、將新的CAB文件插入到MSI文件中。若是是CAB文件獨立於MSI,跳過該操做。
首先,在DOS下或MsiDb.exe快捷方式下,使用「MsiDb.exe -k CAB文件名 -d MSI文件名」命令刪除MSI文件中的CAB文件(其實只是清除關聯)。而後使用「MsiDb.exe -a CAB文件名 -d MSI文件名」命令插入新的CAB文件到MSI文件中。
其中:(1)CAB文件名就是Media表中的Cabinet 列中的CAB文件名。注意忽略前置的「#」。
(2)CAB 和 MSI 文件名均要帶後綴擴展名。
若是提示不成功,請先用「MsiDb.exe -k CAB文件名 -d MSI文件名」命令清除流,而後再用「MsiDb.exe -a CAB文件名 -d MSI文件名」添加新的CAB文件。
注意:MsiDb.exe 對某些長文件夾名不支持,會提示錯誤。建議儘可能用短文件夾名。
1四、安裝測試。運行一下安裝程序,看看是否會在安裝過程當中出現相似「文件不存在」等錯誤,若是沒有,則大功告成。 測試
備註 命令行
一、謝謝您閱讀,若是本文對您有些幫助,將十分榮幸。
二、本文版權屬wanfu全部,歡迎在保持完整和不修改的條件下轉載本文。
三、聯繫郵件:z_shangyi@163.com
關於壓縮率
一、默認狀況下,用IEPress製做的CAB文件壓縮率相對較低。經初步測試,IEpress的腳本支持Makecab.exe的全部參數,只要在[Options]節中添加CompressionType=lzx一行,就能夠實現 lzx 壓縮率。
二、根據 zhfi 網友的提示,查了一下有關資料,用 cabarc.exe -m LZX:21 -r N CAB文件名 "文件所在目錄\*" 命令確實能夠得到比 IEpress 更高的壓縮率,並且不存在順序問題。可是若是有MSI 中有 XXX. 這樣的文件,而實際解壓後沒有了 XXX. 這樣的文件,就沒法打包成和原始CAB同樣的新CAB文件,只能經過修改MSI文件中的File表中的File列中的相關文件名以及在其餘表中所關聯的文件名才能解決。
三、根據漢化好友"魚「的方法,能夠在要壓縮的文件所在的文件夾下,用如下命令行實現:
makecab /f <完整路徑>MsiFileList.txt /d compressiontype=lzx /d compressionmemory=21 /d maxdisksize=1024000000 /d diskdirectorytemplate=data* /d cabinetnametemplate=data*.cab
這裏:MsiFileList.txt 是指MSI文件中File表中的File列的文件名列表(請按Sequenec 列從小到大排列),
diskdirectorytemplate=data* 中的 data*,即分卷壓縮的狀況下,在要壓縮的文件所在的文件夾下生成 data1/data2/data3……文件夾,不分卷壓縮的狀況下,只生成一個文件夾。
cabinetnametemplate=data*.cab 中的 data*.cab,即分卷壓縮的狀況下,data1/data2/data3……文件夾中生成data1.cab/data2.cab/data3.cab......等CAB文件名。
可是,若是有原CAB中有XXX. 和XXX二個解壓後文件名相同的文件,那麼該方法就不適用了。
四、若是你已經刪除了CAB中的一些文件,並對相關的MSI表進行了修改(如不修改會出現安裝錯誤!),須要縮小MSI文件的話,請使用Orca打開清流後的MSI,而後另存爲一個MSI文件,而後用MsiDb.exe插入新的CAB便可。2008-12-07注
整個文件下載:MSI安裝程序中的文件替換.mht