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

标签 windows windows-installer

我有一个包含一些开发文件(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 将不会在管理安装期间提取。这对我来说似乎是一个错误(尽管这是设计使然),但您可以使用它来实现您想要的东西 - 我认为 - 但它并不完全漂亮。

  1. 转换:进行转换,将要素表中您不想提取的所有要素的级别列设置为 0。
  2. 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 文件,而不是更改它们)。

如果您安装了 Visual Studio

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/

相关文章:

java - 无法找到或加载主类文件

c# - 如何检测正在运行的 MSI 安装

c++ - 十六进制数组 cout 到文本文件失败

将空指针(数据)转换为函数指针

android - 如何取消阻止使用 adb shell pm block 命令阻止的应用程序?

WIX MSI - 属性覆盖优先级

wix - 使用初始 IIS 设置安装 Web 应用程序;使用 WiX,需要升级文件,不更改 IIS 设置

c# - 在 C# 中从 Msi 中的自定义操作强制重启

wix - Windows Installer 错误 1316。安装程序查找错误的文件名

windows - 用于windows分页的Git