HOWTO · PowerShell
在 PowerShell 中安装 MSI 文件
本文提供了使用 PowerShell 安装 MSI 文件的解决方案。
本页内容
若要从 PowerShell 安装 Windows Installer 软件包,请使用 msiexec.exe,并提供软件包路径和安装选项。如果脚本需要等待安装程序完成并检查其退出代码,请将 Start-Process 与 -Wait 和 -PassThru 一起使用。
了解 MSI 安装任务
MSI 文件是 Windows Installer 软件包。PowerShell 可以启动安装过程,但实际安装由软件包和 Windows Installer 服务执行。以下命令适用于 Windows。请使用运行命令的账户能够访问的 MSI 路径;若要为所有用户安装软件或写入受保护的位置,可能需要在提升权限的 PowerShell 会话中运行。
使用 Start-Process 安装 MSI
将 msiexec.exe 作为程序启动,并将软件包路径作为其 /i 选项的参数传入。请给软件包路径加引号,确保其中的空格仍属于同一个参数。将示例路径替换为软件包的实际位置。下面这个独立示例只会预览参数字符串,不会启动安装程序。在 Windows 上,可以使用 Start-Process -FilePath 'msiexec.exe' -ArgumentList $arguments -Wait -PassThru 运行生成的参数,然后按下文所述检查返回的进程。
运行这个独立的参数预览示例:
本节中的代码以及显示的标签或输出仍为英文。
$msiPath = 'C:\Packages\Example.msi'
$arguments = "/i `"$msiPath`" /qn /norestart"
"msiexec.exe $arguments"
msiexec.exe /i "C:\Packages\Example.msi" /qn /norestart
/i 表示请求安装,/qn 表示不显示用户界面,/norestart 则禁止 Windows Installer 自动重启计算机。静默模式不会提供交互式进度,因此只有在这种行为适合部署场景时才使用。软件包仍可能要求提供属性、许可证值或其他选项;请查阅其文档。参数预览示例可移植,而实际安装命令仅适用于 Windows。
传递选项并等待完成
-Wait 会让 PowerShell 脚本等到进程结束后再继续。-PassThru 会返回一个进程对象,进程退出后可从中读取 ExitCode。如果不等待,脚本可能会在安装完成前继续执行。/norestart 控制安装程序的重启行为,但不能保证所有软件包都不会要求稍后重启。请在部署流程中安排好可能需要的重启。
检查安装结果
不要仅仅因为 Start-Process 已返回,就打印成功消息。请检查进程退出代码:Windows Installer 用 0 表示成功,用 3010 表示安装成功但需要重启,其他代码则表示不同结果。请处理与部署相关的代码,并将其记录在自己的日志系统中。如果进程无法启动,PowerShell 会报告启动错误;如果进程已启动但安装失败,请检查安装程序退出代码和软件包日志。
如需诊断日志,可在参数字符串中添加日志路径,例如 /L*V "C:\Logs\Example-install.log",并确保目录已存在且可写。请查看日志中与所报告故障相关的内容。进程已启动或界面处于静默状态,都不能证明产品已正确安装。
选择安装方式
Start-Process 是这里的直接选择,因为它会用明确的参数启动 Windows Installer 可执行文件,并且可以等待其返回结果。Invoke-Expression 会执行构造出来的 PowerShell 命令字符串;不建议用它拼接这条调用,因为路径和参数的引号处理更难判断。应将数据作为进程参数传递,而不是把数据转换成可执行命令文本。
Win32_Product 是用于已安装 Windows 产品的 WMI 类,并不是安装 MSI 的推荐方式。查询它可能触发 Windows Installer 一致性检查,因此不适合作为通用清单或安装捷径。此任务应使用软件包文档指定的部署方式,或使用 msiexec.exe。
在远程计算机上安装
本地的 Start-Process 命令会在本机运行。若要远程安装,请使用获准的部署工具或已配置的 PowerShell 远程处理会话,并确保拥有访问目标计算机和该计算机上 MSI 文件的权限。软件包路径必须能在远程计算机上解析,或指向安装程序进程可读取的位置;仅在本地交互会话中映射的驱动器,远程环境可能无法访问。远程执行不会绕过 Windows 权限或部署策略。
前提条件与故障排查
确认 MSI 路径存在且运行进程的账户可以读取,并确认目标计算机支持该软件包。遇到拒绝访问错误时,请检查权限提升状态和部署权限。遇到进程启动错误时,请确认 Windows 和 msiexec.exe 均可用。若安装程序返回非零代码,请检查软件包日志、所需属性、待处理的重启状态,以及是否有其他安装正在进行。请将退出代码与部署日志一同保存,以便区分需要重启的成功安装和失败安装。