主要是为了方便用户操作,毕竟安装程序是用户接触这个应用程序之前的第一个应用程序,自然是希望操作越简单越好,最好是可以不停地下一步或者继续就可以安装成功(这也给了那些恶意软件操作的空间,如捆绑安装)。

在安装期间,最常见的就是设置安装路径,还有的呢会进行修改 Windows 设置,如一些环境 Node,Python 会添加环境变量至 Path。还有一些会创建或修改注册表条目,如文件关联,比如 Jetbrains 系列的软件会让你勾选默认使用它的软件打开 xxx 文件。还有一些方便用户的操作,比如添加到任务栏,或者添加到开始菜单,生成快捷方式之类的。

如果你使用解压方式安装的话,通常你需要你自己设定安装路径,可能也不会生成快捷方式,甚至有一些需要你配置文件,如 MySQL 5.7 解压版本需要你单独配置 my.ini 这个文件,还有些环境需要你解压后设置一些特定名称的空目录。

通常来说在 Windows 中,在你打开拿个软件安装包(.exe)时,系统会执行这个 exe 并将它加载到内存中。 exe 文件会提取大量文件,包括一个 MSI 文件(比如 Node 就是这种格式的)简单理解为一个安装包内的安装程序,还包括一些 cabinet 文件 (.cab) ,将它们提取到用户的 appdata 文件夹中的临时文件夹,并继续执行 MSI

cabinet 文件 (.cab) 一种压缩格式的文件,它包含压缩数据,如系统文件,网络组件和设备驱动程序,也可以加快从网站下载文件的速度。在程序的安装过程中,cabinet 中的文件将被解压缩并复制到用户适当的目录中。

当 MSI 运行时,首先可能会进行 UAC 提示(用户账户控制,有盾标的软件),然后进行兼容性检查,并检测是否需要一些附加软件的安装,如 .net environment

会检测是否有另一个相同的安装程序在运行,调用 cabinet 文件,根据用户输入和预定义的规则开始将文件写入磁盘,修改注册表以创建一个安装和卸载的条目,注册应用程序运行时所需要的所有的 .dlll 和 .ocx 库。安装任何必要的驱动程序,验证所有成功完成的步骤,如果没有完成,它会回滚操作,比如由于网速问题某个软件包没有安装成功,可能就会返回上一步让你重新勾选需要的软件包。然后,执行临时文件的基本清理,在桌面上创建快捷方式,将其添加到开始菜单或任务栏。如果安装或修改了系统文件,驱动程序或服务,系统会提示需要重新启动。