<var id="9nznz"></var>
<del id="9nznz"></del>
<ins id="9nznz"></ins>
<cite id="9nznz"><span id="9nznz"></span></cite>
<ins id="9nznz"><noframes id="9nznz">
<ins id="9nznz"><noframes id="9nznz"><ins id="9nznz"></ins>
登錄賬號    免費注冊    關于我們    操作指南    常用工具     設為首頁    加入收藏    聯系我們
    網站首頁  ▲官方微信    ▲官方博客    ▲官方微博

 綜合搜索

 站內搜索
    當前位置:計算機教程 > 工具軟件 > 正文閱讀


MSI安裝程序中的文件替換


媒體:原創  作者:佚名
專業號:真逗  2010/1/12 7:03:13 發布


前言

最近有漢化朋友問起如何不重新制作MSI文件,而直接用漢化好的文件替換MSI安裝程序中的文件。為此,將本人的實踐經驗作個總結,供各位漢化人參考。有錯誤的地方煩請指正。

※說明:
目前可以用于MSI編輯的軟件很多,但是有些軟件在保存時會在MSI文件中寫入一些自己的表或內容,有些會另外嵌入一個CAB文件,使得MSI文件增大。而這里提供的方法保證不會寫入任何不必要的內容和文件。

※關鍵點:
1、CAB中的文件順序要和MSI的文件表中的文件順序保持一致。
2、有些CAB中的文件使用了Windows不支持的文件名。
 

軟件準備

1、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

2、MsiDb,微軟提供的MSI中CAB文件提取和替換工具。本人的漢化版下載地址(版本為4.5.6001.22192):
http://www.wanfutrade.com/software/hanhua/MsiDb.exe

3、IExpress,微軟提供的CAB文件打包用戶界面工具。本人的漢化版下載地址(版本為6.0.3790.0):
http://www.wanfutrade.com/software/hanhua/iexpress20.exe

4、Excel,相信這個大家都有吧。什么版本都可以。

基礎知識

1、MSI文件的格式
MSI文件實際上一個安裝數據庫,里面有很多表,這些表都是由 TAB 格式寫成的文本,就像EXCEL一樣由列和行組成??梢詮腗SI中導出每個表。導出的表可以用文本編輯器和EXCEL打開。至于每個表和表中每個字段的作用就不在這里講述了。請參考微軟提供的相關資料。

2、MSI安裝文件存在形式
MSI 安裝程序中,需要安裝的文件的存在形式許多種,常見的有以下幾種:
(1)安裝文件被打包為CAB文件,并嵌入在MSI文件中
(2)安裝文件被打包為CAB文件,但CAB獨立于MSI存在
(3)安裝文件未被打包為CAB文件,而是以原來的狀態存在于各個文件夾中
對于以(1)、(2)形式存在的CAB文件,可以采用本文介紹的方法替換,而對于以(3)形式存在的文件文件直接替換即可。

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文件名。注意:文件名前的“#”不是真正文件名的一部分。

開始實踐

1、首先提取嵌入在MSI中的CAB文件。如果是CAB文件獨立于MSI,跳過該操作。
  在DOS下或MsiDb.exe快捷方式下,使用“MsiDb.exe –x CAB文件名 -d MSI文件名”命令提取。
其中:(1)CAB文件名就是Media表中的Cabinet 列中的CAB文件名。注意忽略前置的“#”。
(2)CAB 和 MSI 文件名均要帶后綴擴展名。

2、直接用Windows 資源管理器或RAR或其他壓縮軟件提取CAB文件中的文件到一個單獨的文件夾。

3、使用CMD命令,轉入DOS界面,在釋放CAB中的文件的單獨文件夾下,使用“dir /b > CabFileList.xls”命令提取該文件夾中的文件名列表。這里的CabFileList.xls文件名您可以用其他文件名代替,自由命名。

4、用MsiDb.exe或Orca打開MSI文件,導出MSI文件中的File表。導出后的文件名為File.idt。

5、用EXCEL打開File.idt文件,并按 Sequenec 列對整個表進行排序備用。如下圖。
附加圖片

6、比較從CAB中提取的文件數量是否與MSI文件中的File表中所列的文件數量相等??梢灾苯釉贛SI文件和解開的文件夾中判斷,也可以用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列中后面帶 . 的文件)。
附加圖片

7、在提取的文件夾中,將在有差異的文件的文件名后添加一個數字或其他什么,將其改名,然后再從CAB文件中提取有差異的文件的另一個文件。

8、在CabFileList.xls中插入一個工作表,將第5步中已排序的File.idt 文件的File列和Sequenec 列分別復制到新的工作表中,并在其他列中添加“FILE”、“"”、“=”等列,然后用CONCATENATE文本合并函數,將這些列中的數據合并成IExpress所需的腳本格式。如圖所示。
附加圖片

9、用漢化好的文件替換已解開的文件(注意:第6、7步中有差異的文件)。
※推薦直接漢化已解開的文件,以免重新命名等麻煩。

10、運行IExpress,選擇“僅創建壓縮文件”選項(如圖),將已用漢化替換的文件全部或部分添加到要打包的文件中,然后選擇“在軟件包中使用長文件名保存文件”選項,最后保存好.SED擴展名的IExpress腳本文件。
附加圖片
附加圖片
附加圖片

11、修改IExpress腳本文件。用文本編輯器打開剛才保存的IExpress腳本文件(.sed),并從第8步的EXCEL表中復制SED[Strings] 列到IExpress腳本文件的 [Strings] 節中,同理,復制SED[SourceFiles0] 列到 [SourceFiles0] 節。
※重要提示:
如果第6、7步中有差異文件存在,請在IExpress腳本文件的 [Strings] 節中,將有差異的文件按MSI文件中的文件名命名(在第8步中已經采用了MSI中的文件名列表,所以這里一般不需要修改)。并將IExpress腳本文件的 [SourceFiles0] 節中的文件名全部改為在資源管理器中存在的實際文件名。
※備注:
(1)在一般的IExpress腳本文件(.sed)的[SourceFiles0] 節中的“=”號后是沒有文件名的。因為有差異文件名存在,所以這里需要特別處理。
(2)創建CAB時,程序會自動刪除[SourceFiles0]節中的所有文件名。請注意保存備份,并在下次創建時復制回去。


12、再次運行IExpress,打開剛才修改好的IExpress腳本文件,一路下一步,一個已用漢化后文件替換的符合MSI文件中的File表的文件順序的新CAB文件生成了。

13、將新的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 對某些長文件夾名不支持,會提示錯誤。建議盡量用短文件夾名。

14、安裝測試。運行一下安裝程序,看看是否會在安裝過程中出現類似“文件不存在”等錯誤,如果沒有,則大功告成。

備注

1、謝謝您閱讀,如果本文對您有些幫助,將十分榮幸。
2、本文版權屬wanfu所有,歡迎在保持完整和不修改的條件下轉載本文。
3、聯系郵件:z_shangyi@163.com

關于壓縮率

1、默認情況下,用IEPress制作的CAB文件壓縮率相對較低。經初步測試,IEpress的腳本支持Makecab.exe的所有參數,只要在[Options]節中添加CompressionType=lzx一行,就可以實現 lzx 壓縮率。
2、根據 zhfi 網友的提示,查了一下有關資料,用 cabarc.exe -m LZX:21 -r N CAB文件名 "文件所在目錄\*" 命令確實可以獲得比 IEpress 更高的壓縮率,而且不存在順序問題。但是如果有MSI 中有 XXX. 這樣的文件,而實際解壓后沒有了 XXX. 這樣的文件,就無法打包成和原始CAB一樣的新CAB文件,只能通過修改MSI文件中的File表中的File列中的相關文件名以及在其他表中所關聯的文件名才能解決。
3、根據漢化好友"魚“的方法,可以在要壓縮的文件所在的文件夾下,用以下命令行實現:
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二個解壓后文件名相同的文件,那么該方法就不適用了。
4、如果你已經刪除了CAB中的一些文件,并對相關的MSI表進行了修改(如不修改會出現安裝錯誤?。?,需要縮小MSI文件的話,請使用Orca打開清流后的MSI,然后另存為一個MSI文件,然后用MsiDb.exe插入新的CAB即可。2008-12-07注

整個文件下載:MSI安裝程序中的文件替換.mht

媒體:原創  作者:佚名
專業號:真逗  2010/1/12 7:03:13 發布
0

我也說兩句
E-File帳號:用戶名: 密碼: [注冊]
評論:(內容不能超過500字,如果您不填寫用戶名和密碼只能以游客的身份發表評論。)

*評論內容將在30分鐘以后顯示!
版權聲明:
1.依據《服務條款》,本網頁發布的原創作品,版權歸發布者(即注冊用戶)所有;本網頁發布的轉載作品,由發布者按照互聯網精神進行分享,遵守相關法律法規,無商業獲利行為,無版權糾紛。
2.本網頁是第三方信息存儲空間,阿酷公司是網絡服務提供者,服務對象為注冊用戶。該項服務免費,阿酷公司不向注冊用戶收取任何費用。
  名稱:阿酷(北京)科技發展有限公司
  聯系人:李女士,QQ468780427
  網絡地址:www.arkoo.com
3.本網頁參與各方的所有行為,完全遵守《信息網絡傳播權保護條例》。如有侵權行為,請權利人通知阿酷公司,阿酷公司將根據本條例第二十二條規定刪除侵權作品。

 

  
宇翔微機外語學校

學員的成績是廣告

    熱點文章
專業號:真逗


真逗的最新文章:
Copyright (C) 1998-2024 版權所有 宇翔微機外語學校 All rights reserved  2014年12月1日改版  后臺管理
總校地址:黑龍江省鐵力市火車站前林業局團結路 122 號 2 樓(宇翔大街南、松濤道口路西)(原火車站前停車場北老管開發樓2樓遷此)
電話:0458-2387012  13504572966  E-mail:  yxwjwyxx@163.com    QQ:394035028    QQ:710002157
技術支持:北京宇翔盛文國際科貿有限公司技術部    QQ:767876168    E-Mail:  hljtlyx@163.com
          基于 E-file 技術構建 黑ICP備08003350號
WWW.1068X.COM