我有一个包含一些开发文件(gstreamer 开发文件)的 .msi,我想将 .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 中仅提取选定的功能而不将其安装到系统中吗?
最佳答案
Short Answer: Make a transform, set
Feature Table => Level Column to 0
for features you want to exclude from file extract. Run administrative installation as follows:msiexec.exe /a MySetup.msi TRANSFORMS=MyTransform.mst TARGETDIR=C:\MyExtractPath\
变换:目前我可能想不到其他方法,但您可以尝试的一种方法是进行应用的变换行政安装。根据 MSI 中的功能数量,这可能需要大量工作,也可能根本不需要太多工作(如果您想要排除的功能很少)。
功能级别:MSI 中有一个特性,其中 feature有它的 Feature level设置为 0
将不会在管理安装期间提取。这对我来说似乎是一个错误(尽管这是设计使然),但您可以使用它来实现您想要的东西 - 我认为 - 但它并不完全漂亮。
- 转换:进行转换,将要素表中您不想提取的所有要素的级别列设置为 0。
msiexec.exe:通过命令行将转换应用到 MSI,如下所示:
msiexec.exe /a MySetup.msi TRANSFORMS=MyTransform.mst TARGETDIR=C:\MyExtractPath\
工具:您需要一个工具来帮助您进行此转换。您可能已经有了这个,但对于其他人:我推荐 Orca.exe - 微软自己的SDK工具。但是,您可以使用许多免费的工具。大多数(我认为)描述如下:How can I compare the content of two (or more) MSI files? (向下滚动到列表底部 - dark.exe
是反编译器,而不是 MSI 查看器 - 该链接描述了比较 MSI 文件,而不是更改它们)。
Orca.exe 将已经在磁盘上(很可能)。尝试在 Program Files (x86)
下搜索 Orca-x86_en-us.msi
。只需安装它并在开始菜单中找到 Orca(或搜索它)即可。
高级:上面的“比较 MSI”中链接了一个 VBScript (widiffdb.vbs
)回答。它允许比较两个 MSI 文件。还有另一个 VBScript 允许您通过 SQL 语句更新 MSI。参见这里:WiRunSQL.vbs 。如果您安装了 SDK,则可以在磁盘上找到这些脚本,或者可以在 github.com 上找到它们。 。请参阅 this answer 中底部的脚本使用示例。 。 如果您有大量功能级别需要设置为 0,请尝试此操作。显然将所有功能设置为 0,然后通过将它们设置回正常(1 或更高 - 取决于 MSI)来手动打开您需要的功能。
模型:将所有功能级别
设置为0<的示例VBScript代码
:
Note! Do not run this on your main source MSI file. Make a copy!
No error handling in this script. To generate a transform see sample here (generate transform based on diff between original and modified MSI file).
Const msiOpenDatabaseModeTransact = 1
Const msiViewModifyReplace = 4
Set installer = CreateObject("WindowsInstaller.Installer")
Set database = installer.OpenDatabase("Test.msi", msiOpenDatabaseModeTransact)
' Allow user to cancel operation
If MsgBox ("Only run this on a COPY of your MSI!" & vbNewLine & vbNewLine & "Continue?", vbYesNo + vbInformation, "Warning!") = vbNo Then
MsgBox "Update Aborted.", vbOKOnly + vbInformation, "Aborted"
WScript.Quit(0)
End If
sql = "SELECT * FROM `Feature`"
Set view = database.OpenView(sql)
view.Execute()
Do
Set record = view.Fetch()
If record Is Nothing Then Exit Do
record.IntegerData(6) = 0
view.Modify msiViewModifyReplace, record
Loop
view.Close()
database.Commit()
MsgBox "Update Complete.", vbOKOnly + vbInformation, "Completed"
关于windows - 如何从命令行提取.msi功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53724845/