您可能知道,msiexec是一个命令行应用程序,可用于安装 MSI 文件。您可能知道,您可以在静默或不可见模式下运行它。
如果安装程序要求用户回答有关要安装哪些部件的特定问题,是否可以通过某种方式在 msiexec 命令行中添加一系列选项来执行此操作?
我认为必须有某种方式来设置 MSI 文件的默认设置才能实现这一点。MSI 文件是如何制作的?它们是通过 Microsoft 的工具开发的吗?它们可以打开和编辑吗?
您可能知道,msiexec是一个命令行应用程序,可用于安装 MSI 文件。您可能知道,您可以在静默或不可见模式下运行它。
如果安装程序要求用户回答有关要安装哪些部件的特定问题,是否可以通过某种方式在 msiexec 命令行中添加一系列选项来执行此操作?
我认为必须有某种方式来设置 MSI 文件的默认设置才能实现这一点。MSI 文件是如何制作的?它们是通过 Microsoft 的工具开发的吗?它们可以打开和编辑吗?
MSI 文件专门设计用于支持静默安装作为内置功能 - 您始终可以跳过 GUI。但是,一些 MSI 文件存在设计缺陷,导致在静默模式下安装不完整——这是一个严重的设计错误。此处描述了此问题:
:从控制面板卸载不同于从 .msi 中删除(静默与交互式安装- 技术性和实用性)
在现实世界中看到的常见 MSI 问题的一般描述中也有一个部分(Common MSI Problems - 一般问题和反模式)
简短版本:如何从电子生成器参数化 msi 文件 - 使用公共属性和转换来自定义 MSI 包的安装。
在静默安装 MSI 时,您需要做的是从 msiexec.exe 命令行或通过对原始 MSI 文件应用所谓的转换来配置设置。这两个选项都在下面的单独部分中进行了描述。
如果 MSI 文件设计良好,您将能够从 msiexec.exe 命令行或使用转换文件修改原始 MSI 设置公共属性(它们总是大写)。这些操作如下所述。公共属性最容易在 MSI 文件的“属性表”中找到。使用您选择的 MSI 工具打开 *.msi 文件并导航到属性表。还有一些免费的 MSI 工具可用于生成转换和查看(和编辑)MSI 文件:如何比较两个(或更多)MSI 文件的内容?(指向底部的链接)。
精心设计的 MSI 设置可通过这些公共属性进行完全配置。设计不良的 MSI 文件不是。设计不佳的 MSI 文件最好使用转换文件进行调整(这可以对整个 MSI 文件进行重大更改以在安装时应用)。设置公共属性只能更改公共属性可配置的任何内容 - 正如设置创建者所设计的那样。转换几乎可以改变整个 MSI 文件中的任何内容。
通常,所有公司的静默部署都是使用转换来完成的,以“将 MSI 文件打造成符合公司标准的形状”。它是一种非常有效的企业部署工具,被广泛使用。
几个安全保存的链接:
MSI 通常是违反直觉的,并且在引擎盖下有些复杂。但是,过度简化的 MSI 文件包含一个或多个“功能”——正如您所说,这些功能共同构成了“应用程序的部分”。反过来,功能由“组件”组成——它们是整个软件的基本安装单元——但这是一个非常技术性的细节——这个答案是关于 MSI 的用户公开位——功能。
屏幕截图:真正的 MSI 包中的功能是什么样的(屏幕截图)。
您通常可以通过交互式运行安装程序找到这些功能的列表,然后导航到自定义安装对话框(并非总是存在)。此处显示的功能是应用程序的“用户可配置”部分,可以选择排除或包含(有些是强制性的)。您还可以通过使用上述功能强大的工具打开 MSI 来找到这些功能(您还可以在下面的第 2 节中查看链接)。
典型功能有:Core or Program、Dictionaries、Samples、Plug-Ins、Spell Checker、SDK & Developer Tools(用于开发工具)等...有些功能是强制性的(必须安装)——上面的例子是Core和Program,其他是可选的,应用程序启动不需要(如上面的开发工具功能)。可以使应用程序“按需”安装功能 - 例如,当用户启动拼写检查时,拼写检查器。
根据我的经验,大多数用户都希望安装整个应用程序。如果 Windows Installer 意外弹出并开始安装拼写检查器组件,许多用户会非常恼火。坦白说非常好理解。然而,只有少数用户感兴趣的很少使用的模块化组件可以制成可选组件——特别是如果系统管理员可能不希望在他们的网络上使用该功能。开发人员工具当然就是这种情况——普通用户不应该使用这些工具。他们往往是人们需要在脚上射击自己的所有绳索。
如上所述,自定义 MSI 安装通常有两种方法:(1)使用 msiexec.exe 自定义命令行,或使用 (2)转换文件。
控制安装过程中安装哪些功能的最简单、轻量级的方法是使用msiexec.exe
命令行指定您的功能选择。有一整套用于功能配置的属性。但是,在大多数情况下,指定以下内容就足够了ADDLOCAL
:
msiexec.exe /i myinstaller.msi ADDLOCAL="Program,Dictionaries" /qn
上面的命令行指定应该在本地安装功能“程序”和“字典”(功能名称区分大小写!)。这通常就足够了,但您也可以使用 REMOVE 属性以类似的方式指定要删除的任何功能。一个特殊的开关ADDLOCAL=ALL
将在本地磁盘上安装 MSI 中的所有功能(前提是 MSI 中没有额外的逻辑来覆盖它)。MSDN 上的 ADDLOCAL 属性。
由公共属性定义的一个非常常见的事情是应用程序的许可证密钥。以下命令行指定安装功能“程序”和“字典”并应用序列号“1234-1234”:
msiexec.exe /i myinstaller.msi ADDLOCAL="Program,Dictionaries" SERIALKEY="1234-1234" /qn
正如上面的描述所暗示的,每个设置的可定制属性列表总是不同的。您可以找到 MSI 文件的属性表中列出的大多数属性,但也有可能设置了一些属性表中未定义的属性。在大多数情况下,这与仅从设置 GUI 设置的属性有关(在大多数情况下表示设置设计错误)。所有属性都应在正确编写的包的属性表中定义。
在供应商的下载页面上查找文档,并向他们寻求与静默安装或大规模部署相关的任何文档的支持。做起来很快,如果有标准答案模板,答案也会很快。控制其部署的公司将始终能够提供此服务。在我看来,理想的方式是描述不同部署设置的单页 PDF。坦率地说,如果他们不能提供这些,就给他们一些热量;-)。
MSI 文件本质上是包装在 COM 结构化存储文件(文件中的文件系统)中的 SQL 数据库。转换文件是通过Orca(SDK 链接)、Installshield 或明智的、高级安装程序等...(链接到不同工具的描述)。这些转换可以自定义或覆盖 MSI 中的几乎所有设置或数据库字段 - 包括安装了哪些“应用程序部分”(功能)。创建转换后,您可以在 msiexec.exe 命令行中将其应用程序指定给 MSI:
msiexec.exe /i myinstaller.msi TRANSFORMS="mytransform.mst" /qn
然后,Windows Installer 将在安装开始前合并 MSI 和转换。这是希望完全控制如何安装 MSI的大型组织所使用的方法。MSDN 上的 TRANSFORMS 属性。
如上所述,这是允许修改 MSI 中的所有设置的选项。可以对设计不良的 MSI 文件进行大量修复,以实现可靠的部署。这是由“应用程序打包者”完成的。他们的工作是调整所有设置以符合公司标准。他们可能是最有知识的 MSI 专家之一——他们在 MSI 文件中看到了很多奇怪的东西。
许多工具可用于创建转换,以下是在比较 MSI 文件的技术背景下对此类工具的描述。直接跳到底部的免费工具列表:如何比较两个(或多个)MSI 文件的内容?
Windows Installer 有许多设计怪癖,可能对开发人员来说特别烦人。诚然,有些问题接近于反模式。
实现自定义操作(自定义安装逻辑)的高复杂性问题可能被认为是不可避免的,并且编写自定义操作的行为一旦需要就应该是强大且有能力的 - 因此很复杂。如果技术本身提供了通常用于部署的内容,则很少需要自定义操作。换句话说,您应该使用内置的 MSI 功能而不是自定义操作(如果可用),或者 WiX 或第三方部署软件扩展(如果可用)。
WiX 框架(开源)和类似的商业工具(Installshield、Advanced Installer 等)已经实现了扩展 Windows Installer 的功能,以处理缺少的功能,例如缺少 XML 文件的升级机制、共享创建和管理、创建用户和组、高级 IIS 配置、COM+ 安装、更改 ACL 权限、设置防火墙规则、持久化安装属性等......应该越来越少需要实现自己的自定义操作。如果可以的话,总是使用已经被成千上万的其他用户测试过的功能(甚至数百万的用户——这些扩展是由最好的部署专家编写的——你认为你自己可以做得更好吗?)。
使用 Windows Installer 需要特定的心态。然而,它提供了许多以前的安装技术几乎完全缺乏的关键企业利益。推荐阅读使用 MSI 文件的企业利益。特别是对于那些认为 Windows Installer 麻烦多于其价值的人。
简单总结一下链接的文章,MSI 相对于以前的部署技术的核心企业优势是(在我看来):
这只是为了挑选最重要的那些(经过多年的企业部署)。老实说,这些功能在世界上产生了巨大的影响(对于企业部署),并且确实使 MSI 尽管存在所有缺陷,但仍然非常好用。
随着 Windows Installer 进入暮年,我们只能希望未来的部署技术能够保留这些巨大的企业部署优势,并以有利于所有人,尤其是开发人员的方式处理上述反模式。
部署是开发的关键部分。未能为潜在最终用户成功安装出色的软件可能是整个软件开发中最昂贵的错误。如果用户从来没有看到你的软件完全正常运行,你怎么能成功?
必须更好地处理(降低)Windows Installer 的复杂性,并且必须在接下来的任何范例中正确保留其关键优势。
相当不错:Windows Installer 的总结。
说了这么多;随着计算普遍转向云平台,部署世界可能会以不可预测的方式发生相当大的变化。然而,正如那句名言所说:事物变化越多,它们就越保持不变。部署需要处理未来几十年将在公司中使用的所有遗留技术。这里有一篇关于为什么部署似乎变得更复杂而不是更复杂的文章——尽管有所有的营销:程序安装的好处和真正目的是什么?.
看看部署的未来会是什么——在未来的几年里,这将是一件很有趣的事情。或许我们会看到家用电脑的简化部署,而企业部署会变得比以往更加复杂?在未来,大多数部署可能是数据库部署任务,而不是文件和文件夹部署任务。到目前为止,服务器部署可能非常复杂,包括数据库脚本、用户和组创建、共享设置和 ACL 权限、性能计数器、防火墙规则更新、AD 查询和更新、COM+ 和消息队列配置、服务安装等...... -整个九码。
将带有 MSI 的用户界面视为可选。这意味着不需要任何答案,因为开发人员有合理的默认设置,这样事情就不会中断。
我们以 MSI 格式向企业客户分发我们的软件,我还向他们提供有关 Orca 基础知识的文档(orca.msi与Windows Installer SDK一起分发)以及如何自定义我们在Property
表中列出的某些字段以进行安装。例如序列号、注册详细信息和其他一些设置。
为了回答关于msiexec 命令行选项的原始问题,只需运行MSIEXEC /?
以在命令行上设置属性,您将使用类似
MSIEXEC /I test.msi SOMEPROPERTY="Some value" PROP2="something else"
如何配置静默 MSI 设置
可以通过设置安装程序使用的属性在命令行上配置 MSI 安装。有预定义的 Windows Installer 属性,例如 ALLUSERS 属性。此属性定义安装是在当前用户的上下文中还是在机器的上下文中完成。
例如,可以从安装日志中获取有关可用属性的信息,该安装日志可以使用 msiexec 的 /l 选项创建
msiexec /I mysetup.msi /l*vx log.txt
如何创建 MSI 文件
有很多方法可以创建 MSI 文件。MSI 文件基本上是一个由各种表组成的数据库,其中包含所有必要的设置信息和安装对话框。
Microsoft 提供了一个名为Orca的简单工具,它使您能够编辑现有的 MSI 文件,并允许您找出可以设置哪些属性来配置安装。从理论上讲,也可以使用此工具创建新的 MSI 文件,但这是一种非常麻烦的方法。
如果您正在寻找免费的开源解决方案,我建议您查看SourceForge 或 Nullsoft 上提供的WiX 工具集。所有设置信息都通过 XML 文件完成,然后将其转换为 MSI 安装程序。WiX 是稳定的(尽管仍被标记为 beta)并且可以在生产中使用。实际上它将集成到即将发布的 Visual Studio 2010 版本中。
当然,也有可用的商业解决方案,InstallShield 是市场领导者(也是价格领导者),而 Visual Studio 可能是最广泛使用的工具。