如何从命令行提取.msi功能?

时间:2018-12-11 13:06:59

标签: windows windows-installer msiexec

我有一个.msi,其中包含一些开发文件(gstreamer开发文件),我想从.msi中提取某些功能到某个文件夹中,而无需从命令行安装。

我知道如何使用msiexec的ADDLOCAL属性安装某些功能:

msiexec /i gstreamer.msi /qb TARGETDIR=some\folder ADDLOCAL=_gstreamer_1.0_system,_gstreamer_1.0_libav

但是当我尝试提取文件而不使用管理员安装进行安装时,似乎ADDLOCAL属性不起作用,并且提取了程序包中的所有文件:

msiexec /a gstreamer.msi /qb TARGETDIR=some\folder ADDLOCAL=_gstreamer_1.0_system,_gstreamer_1.0_libav

有人知道如何从.msi中仅提取选定的功能而不将其安装到系统中吗?

1 个答案:

答案 0 :(得分:1)

  

简短答案 :进行转换,为要从文件提取中排除的功能设置 Feature Table => Level Column to 0 。运行管理安装,如下所示:

msiexec.exe /a MySetup.msi TRANSFORMS=MyTransform.mst TARGETDIR=C:\MyExtractPath\

转换 :目前我可能还没有想到其他方法,但是可以尝试的一种方法是进行适用于管理安装。根据MSI中功能的数量,这可能需要很多工作,也可能根本没有很多工作(如果要排除的功能很少)。

功能级别 :MSI有一个特殊之处,即featureFeature level设置为 {{1 }} 不会在管理安装过程中解压缩。对我来说,这似乎是个错误(虽然是设计使然),但是您可以使用它来实现您想要的功能-我想-但这并不完美。

  1. 转换 :进行转换,将所有您不想提取的特征的“特征”表中的“级别”列设置为0。
  2. msiexec.exe :如下所示,通过命令行将转换应用于MSI:

    0

工具 :您需要一个工具来帮助您进行此转换。您可能已经有了,但对于其他人:我推荐Orca.exe-Microsoft自己的SDK工具。但是,您可以使用许多免费的工具。多数(我认为)在这里进行了描述:How can I compare the content of two (or more) MSI files?(向下滚动到底部列表-msiexec.exe /a MySetup.msi TRANSFORMS=MyTransform.mst TARGETDIR=C:\MyExtractPath\ 是反编译器,而不是MSI查看器-该链接描述了比较MSI文件,而不是对其进行更改)。

如果您已安装 Visual Studio ,则

Orca.exe 将已经在磁盘上(很有可能)。尝试在 dark.exe 下搜索 Orca-x86_en-us.msi 。只需安装它,然后在开始菜单中找到Orca(或搜索它)即可。


高级 :上面的“比较MSI”答案中链接了一个 VBScript Program Files (x86))。它允许比较两个MSI文件。还有另一个VBScript,它允许您通过SQL语句更新MSI。参见此处:WiRunSQL.vbs。如果已安装SDK,则可以在磁盘上找到这些脚本,也可以在github.com上找到它们。请参见this answer中底部的脚本用法示例。 如果要将大量功能级别设置为0,请尝试执行此操作 。显然,将所有功能都设置为0,然后通过将它们恢复为正常(1或更高-取决于MSI)来手动打开所需的功能。

模型 :示例VBScript代码将所有 widiffdb.vbs 设置为 Feature levels

  

注意! 请勿在主MSI源文件上运行此文件。 复制!

     

此脚本中没有错误处理To generate a transform see sample here(基于原始MSI文件和修改后的MSI文件之间的差异生成转换。)

0