2012-10-29 63 views
1

更新:我改變了這個問題的標題,以反映真正需要從下面的一些答案。如何在Linux中從MSI獲取文件的真實名稱(或者,如何讀取MSI數據庫)?

我希望在Linux內能夠從Visual Studio 2010本地部署工具中生成的MSI中獲取特定的可執行文件。但是,cabextract獲得的名稱都是時髦:

-rw-r--r-- 1 root wheel  159 Jul 16 17:26 _07DAC52BD05CC8A8D6B2195350CC8C13 
-rw-r--r-- 1 root wheel 34304 Oct 29 12:10 _09C75789ECE59A0AC891A85289474E75 
-rw-r--r-- 1 root wheel 8704 Oct 29 12:10 _0CB147FD23752DEFAC3B73925E1E38DB 
-rw-r--r-- 1 root wheel  766 Oct 29 12:10 _1D0B16C3296C400D9FD4018E77AC0B05 
-rw-r--r-- 1 root wheel 10752 Oct 29 12:10 _24792622E94742D68A455C4F1D54D51F 
-rw-r--r-- 1 root wheel  159 Oct 29 12:10 _90A663D25084CD22A230CCB8F55A3700 
-rw-r--r-- 1 root wheel 12800 Oct 29 12:10 _BC47FBF48B42E5E71C9901188422814A 
-rw-r--r-- 1 root wheel 873984 Oct 29 12:10 _EAFFD36EAA914E7F9D3DAC8BA13DFB6A 
-rw-r--r-- 1 root wheel 4608 Oct 29 12:10 _F434E52DDE0AB5C2D68CE7A78B0B2477 
-rw-r--r-- 1 root wheel 467456 Oct 29 12:10 _F90AF0EB7EEF445A92623132D00191EA 
-rw-r--r-- 1 root wheel 421200 Oct 29 12:10 F_CENTRAL_msvcp100_x86.AFA96EB4_FA9F_335C_A7CB_36079407553D 
-rw-r--r-- 1 root wheel 773968 Oct 29 12:10 F_CENTRAL_msvcr100_x86.AFA96EB4_FA9F_335C_A7CB_36079407553D 

與解決方案的發佈目錄進行比較,我可以看到該文件我想(itragent.exe)實際上是_F90AF0EB7EEF445A92623132D00191EA - 是有沒有辦法走到那在Linux內編程結論?使用cabextract還是藉助其他一些實用程序?這裏有兩個文件是XML文本,但他們只有.NET Framework版本信息,沒有別的。

另一種方法,有沒有辦法強制VS 2010使用正確的名稱在MSI中存檔可執行文件?

回答

1

有問題,cab不包含有關文件「真實」名稱的信息。但它包含這些文件的順序。 MSI文件有表File,其中每個壓縮文件有Sequence號碼。該編號應與機櫃內文件的序列號相同。

我想,你可以打開微星,從FileName列及其Sequence數量以實際文件名,並以某種方式把它們等同起來到駕駛室序列。

有用的鏈接:Description of CAB Formatinformation regarding File tableWindows Installer SDK

1

CAB文件中的.msi數據庫中的主鍵命名。要找到他們的真實姓名,你必須查看數據庫。您需要的表格包括File,如果您只需要FileName(查找來自File)或相對路徑,則還需要Directory(目錄位置的自鏈接樹;請參閱Rob Menshing關於Directory table的系列文章,如果您需要有幫助的話)和Component作爲它的多對多查找表。

請注意,在某些病理情況下,駕駛室中的多個條目可能具有相同的路徑名,因此您可能需要專門處理這些路徑名。這應該是比較罕見的。

+0

啊,我明白了。現在我需要的是從Linux內部讀取這個數據庫的一些方法。是否有一些已經制作的實用程序能夠做到這一點? – JCCyC

+1

它看起來像Wine支持Windows Installer API。您可能會開始查找API:MsiOpenDatabase,MsiDatabaseOpenView,MsiViewExecute,MsiViewFetch,MsiRecordGetString。 –

相關問題