尝试从 WIX msi 运行嵌入式工具以进行选择性安装

Posted

技术标签:

【中文标题】尝试从 WIX msi 运行嵌入式工具以进行选择性安装【英文标题】:Attempting to run embedded tool from WIX msi for selective installation 【发布时间】:2012-01-11 05:07:41 【问题描述】:

基本上,我正在尝试构建一个 WIX msi,它可以运行 devcon.exe(Windows 硬件管理器的命令行版本)来检测是否安装了特定的硬件。如果是,则安装msi A,否则安装msi B(A和B已作为单独的msi包存在,我们需要根据硬件自动选择性安装)。

目前我已经安装了 WIX SDK 并创建了一个正确构建 msi 的 WIX 项目。我可以做一些简单的事情,比如执行CustomActions来打开notepad.exe,那种简单的事情。

第一个问题:我无法找出如何将文件打包到不会安装到目录中的安装程序中。我找到了对它的引用,但没有明确说明如何做到这一点。我不必将它放在“目录”标签中,如果它不会安装到主机驱动器上,对吧?

第二个问题:devcon.exe 没有(据我所知,如果我错了,请纠正我)似乎根据它找到的内容来改变它的返回值,可能是因为它做了很多事情并且不是受限于硬件设备是否存在。因此,如果我可以将其嵌入并运行,那么我需要以某种方式将其输出到标准输出流中,然后将其解析为我正在寻找的特定值。

当然这会更容易一些,因为我已经有了一个批处理文件,它可以进行解析并设置一个环境变量,它会告诉我我需要知道什么,但是,如果我可以同时嵌入它们,如何是否让批处理文件引用嵌入式 devcon.exe,然后让 WIX 读取变量,或者我可以在 WIX 中设置一个(或属性),然后从批处理文件中设置它?

也许我应该创建一个 dll 自定义操作?是否可以从 dll 自定义操作运行嵌入式可执行文件?然后我可以运行 devcon.exe,并在那里进行所有解析,然后只需设置一个 Wix 变量或属性来选择下一步做什么。

第三个问题:能够从另一个运行一个 msi。我还不太了解,但我发现(http://softwareinstall.blogspot.com/2008/06/fun-with-msiembeddedchainer.html)看起来很有希望,虽然我还没有通读然而。一次一个问题,我当然已经够了:)

【问题讨论】:

【参考方案1】:

好的,第一个问题解决了:

<Binary Id="Devcon" SourceFile="D:\Programming\Device_Selection\Device_Selection\devcon.exe"/>
<CustomAction Id="RunDevcon" BinaryKey="Devcon" ExeCommand="resources *vendor*device*" Return="check" Execute="deferred" Impersonate="no" />

这可确保 devcon.exe 工具嵌入在安装程序中,并且我可以在管理员模式下运行它(除非您将 Impersonate 指定为“no”并将 Execute 指定为“deferred”,否则它将不起作用)。

接下来我需要做的是能够读取 devcon 通常发送到控制台的输出(即 cmd 窗口),然后解析它以获取信息。有没有办法捕获该输出?

【讨论】:

【参考方案2】:

对于第二个问题,我会创建一个 EXE 或 DLL 自定义操作来启动 devcon.exe,读取其输出并对其进行解析。 devcon.exe本身可以存放在EXE/DLL的资源中,在启动前解压到一个临时目录,完成后将其删除。

如果您选择 DLL,您可以更改 MSI 公共属性。这样你就可以设置一个属性来控制接下来在 MSI 中要做什么。

如果您选择 EXE,您所拥有的只是退出代码。据我所知,实际上在 MSI 中你无能为力。


不推荐链接 MSI 安装。您可以将两个驱动程序嵌入到一个包中,并根据 devcon.exe 检测结果设置的属性选择要安装的组件。


另一种方法是创建一个引导程序 EXE,它运行 devcon.exe 并确定要安装的软件包。然后它只是安装正确的 MSI 包。

【讨论】:

以上是关于尝试从 WIX msi 运行嵌入式工具以进行选择性安装的主要内容,如果未能解决你的问题,请参考以下文章

WiX创建了msi文件,奇怪的主要升级行为

如何使用 WiX 和 MSI 进行静默安装和卸载?

WiX 自定义操作在 MSI 中使用 [SourceDir] 和 Burn

用于包装的 WiX 工具

WiX MSI 和 EXE 作为一个 EXE

如何使用 WiX 从源代码重建完全相同的 msi 文件?