我有一个.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中仅提取选定的功能而不将其安装到系统中吗?
答案 0 :(得分:1)
简短答案 :进行转换,为要从文件提取中排除的功能设置
Feature Table => Level Column to 0
。运行管理安装,如下所示:msiexec.exe /a MySetup.msi TRANSFORMS=MyTransform.mst TARGETDIR=C:\MyExtractPath\
转换 :目前我可能还没有想到其他方法,但是可以尝试的一种方法是进行适用于管理安装。根据MSI中功能的数量,这可能需要很多工作,也可能根本没有很多工作(如果要排除的功能很少)。
功能级别 :MSI有一个特殊之处,即feature的Feature level设置为 {{1 }} 不会在管理安装过程中解压缩。对我来说,这似乎是个错误(虽然是设计使然),但是您可以使用它来实现您想要的功能-我想-但这并不完美。
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文件,而不是对其进行更改)。
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