我有一个来自第三方工具的MSM文件。我们用一个小脚本自定义MSM,该工具已集成到我们的安装程序中,运行良好。所有修改都是使用COM和"WindowsInstaller.Installer"使用VBscript完成的
但有时我们的支持只需要这个工具作为独立的安装程序包。
有没有一种简单的方法可以在命令行上将MSM文件转换为完整的安装程序MSI包?
使用VBscript或带有"WindowsInstaller.Installer"的COM模块是可以的。知道如何转换它的方法,我还会写一个小C++程序来执行更改并设置适当的信息和转换。
我需要命令行到,将MSM转换集成到我们的构建过程中。
我搜索并发现:
我在SDK中看到了一些工具,比如ORCA和其他MSI工具,但其中没有一个能满足我的需求。ORCA可以将MSM保存为MSI文件,但我在命令行中看不到这样做的选项。
注意:我找到了一个旧工具msm2msi,但它不适用于我的MSM文件并崩溃,而且没有可用的源代码。
编辑关于我们应用的更改:
改变的原因很简单。第三方模块具有"所谓的服务器模式",通常只在1台机器上使用,但MSM为每台机器启用它。所以wie决定在更改属性时禁用它。还有更多的变化。
因此,它更多的是关于主安装。当更新到来时,此设置永远不会被触摸。
MSM也安装了自己的UI,这是我们不想要也不需要的。所有的控制都是通过我们的软件完成的。。。因此,我们安装了组件,但删除了Start文件夹中的菜单项。
任何MSI工具都可以使用MSM文件并从中编译MSI,使用您想要的任何其他构造-也可以想象您对MSM所做的更改?
免费开源的WiX Toolkit肯定能够通过命令行从MSI编译MSI,而且它也是免费开源的WiX快速入门建议。
但是,对于您打算在MSM中进行的修改,有必要引起关注。这确实是一个非常坏的消息,因为MSM文件是专门让最终用户不更改的。如果您能找到一种替代方法来进行所需的更改,例如在编译的MSI文件中的自定义操作,那将是非常好的。
尽管WiX有时需要处理,但合并和MSM再简单不过了:
<DirectoryRef Id="TARGETDIR">
<Merge Id="VCRedist" SourceFile="MySourceFilesMicrosoft_VC80_CRT_x86.msm" DiskId="1" Language="0"/>
</DirectoryRef>
<Feature Id="VCRedist" Title="Visual C++ 8.0 Runtime" AllowAdvertise="no" Display="hidden" Level="1">
<MergeRef Id="VCRedist"/>
</Feature>
完整示例如下:如何:使用安装程序安装Visual C++Redistributable。以及文档:Merge Element。
为什么每次都要合并此MSM?它是否不断更新?如果是,供应商是否可以更改它,使您不需要对其进行后处理?如果它没有更新,你能改变MSM本身吗?做起来不太好——事实上相当可怕——但它可能比不断篡改设置更不容易出错。
转换&msiexec.exe :根据您的更新信息,我想说您可以通过使用转换来解决所有这些问题,甚至可以通过安装命令行设置属性来解决这些问题。
转换允许您更改MSI/MSM中的"任何内容"(它们是在运行时应用于更改MSI/MMS的小数据库片段),设置PUBLIC PROPERTY(始终大写)允许您影响该属性设计要影响的任何内容。因此,后者是由供应商添加和支持的MSI/MSM的"轻量级"定制,这在可用时很好,但根据我的经验,这很少足够(典型的用途是添加许可证密钥或服务器IP或URL,或者只安装MSI的一部分-一些功能-诸如此类的简单东西)。
关于如何使用transforms
或msiexec.exe
命令行自定义MSI安装的说明,可以在此处找到:
- 如何更好地使用MSI文件(详细说明)
- 如何在调整设置的情况下以静默模式运行安装(缩写-">MSI-自定义标准包"部分)
GUI :我真的不明白当MSM"安装在自己的GUI中"时你指的是什么?希望这只是从开始菜单启动可执行文件的快捷方式?如果是这样,您可以使用变换轻松地将其移除。
创建转换
:您可以使用Orca(MSSDK工具)或任何其他MSI部署工具创建转换,也可以使用
MSI API来编程创建转换(Win32、COM、.NET)。
-
COM自动化:Microsoft MSI SDK包含一个名为WiGenXfm.vbs的VBScript。如果安装了Visual Studio,就会安装它。你也可以在github.com上找到它(但一定要从你自己的磁盘上找到)。
-
DTF/.NET是WiX的一个组件,允许您通过托管代码访问MSI API。互操作已为您完成。在这里取样。
-
C++/Win32 :一直到金属Win32(不接受替代层-层不存在:-))。
注意:DTF是作为WiX工具包的一部分安装的。能够构建MSI文件的开源工具包(快速启动建议)。安装后,在%ProgramFiles (x86)%
下的WiX安装文件夹中查找dll。子文件夹">bin"。此处的文件描述。最后,我将以DTF的快速示例结束,该示例从MSI文件中获取一些属性。