基本上我正在尝试构建一个可以运行devcon.exe(Windows硬件管理器的命令行版本)的WIX msi,以检测是否安装了特定的硬件。如果是,则安装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变量或Property来选择下一步做什么。
第3个问题:能够从另一个运行一个msi。我还没有达到这个目的,但我发现(http://softwareinstall.blogspot.com/2008/06/fun-with-msiembeddedchainer.html)看起来很有希望,尽管我还没有读完所有内容。然而。一次有一个问题,我已经足够了:)
答案 0 :(得分:0)
好的,第一个问题解决了:
<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”并执行为“deferred”),否则这不起作用。
我需要做的下一件事是能够读取devcon通常发送到控制台的输出(即cmd窗口),然后解析它以获取信息。有没有办法捕获那个输出?
答案 1 :(得分:0)
对于第二个问题,我创建了一个EXE或DLL自定义操作,它启动devcon.exe,读取其输出并解析它。 devcon.exe本身可以存储在EXE / DLL的资源中,并在启动之前提取到临时目录中,然后在完成后将其删除。
如果选择DLL,则可以更改MSI公共属性。这样你就可以设置一个属性来控制MSI中接下来会做什么。
如果您选择EXE,您只需退出代码即可。据我所知,实际上在MSI中你可以做的并不多。
不建议链接MSI安装。您可以将两个驱动程序嵌入到一个程序包中,并根据作为devcon.exe检测结果的属性集选择要安装的组件。
另一种方法是创建一个运行devcon.exe的bootstrapper EXE,并确定要安装的软件包。然后它只是安装正确的MSI包。