1

更新:我更改了这个问题的标题,以反映以下一些答案的真正需要。

我希望能够在 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

与解决方案的 Release 目录相比,我可以看到我想要的文件 (itragent.exe) 实际上是 _F90AF0EB7EEF445A92623132D00191EA - 有没有办法在 Linux 中以编程方式得出这个结论?使用 cabextract 还是借助其他实用程序?那里有两个 XML 文本文件,但它们只有 .NET Framework 版本信息,没有别的。

或者,有没有办法强制 VS 2010 在 MSI 中使用正确的名称归档可​​执行文件?

4

2 回答 2

1

cab 文件以 .msi 数据库中的主键命名。要找到他们的真实姓名,您必须查看数据库。如果您只需要(从 查找),则需要的表包括File,或者对于相对路径,您还需要Directory (目录位置的自链接树;如果您需要帮助理解它)和组件作为多对多查找表。FileNameFile

请注意,在某些病理情况下,一旦完成,cab 中的多个条目可能具有相同的路径名,因此您可能必须特别处理这些。这应该是比较少见的。

于 2012-10-30T12:19:44.887 回答
1

有问题,cab 不包含有关文件“真实”名称的信息。但它包含这些文件的顺序。MSI 文件有表File,其中每个压缩文件都有Sequence编号。此编号应与文件柜内文件的序号相同。

我认为,您可以打开 MSI,从列中获取真实文件名FileName及其Sequence编号,并以某种方式将它们等同于 cab 序列。

有用的链接:CAB 格式的描述有关文件表Windows Installer SDK的信息

于 2012-10-30T12:11:56.587 回答