从脚本安装 .msi,检测安装何时完成

从脚本安装 .msi,检测安装何时完成

我正在尝试制作一个安装脚本。我想安装一个 .msi 文件、Python,然后在安装 Python 后安装其他东西。我已经了解如何进行命令行安装。但是,msiexec即使安装仍在运行,也会立即返回。如何从批处理脚本检测 msi 安装是否完成?

答案1

不知道 Python 如何处理将命令传递给 Windows/DOS,但使用普通的批处理文件和命令,start /wait批处理文件会停止并等待 MSI 完成后再继续下一步。

例如,要安装主应用程序,然后在完成时安装补丁,然后在完成后安装最终程序,请将这些行放入 .cmd 文件中:

start /wait msiexec /i O12Conv.msi /qb
start /wait msiexec /p O12Convsp1-en-us.msp /qb
start /wait msiexec /i mpsetupedp.msi

答案2

这很棘手,而且不可靠,但有办法监视进程列表中特定进程的存在。在等待该进程不再存在时,将循环写入 NOOP,然后执行下一步。有几种方法可以处理这种情况。

SysInternals 工具pslist将显示进程,但解析输出可能比较棘手。PowerShell 可以访问 .NET API,通过get-processcmdlet 进行进程监控。

这些方法仅监视进程的存在,它们无法检查退出代码,因此无法知道进程是正常退出还是处于错误状态。为此,您必须处理您指定生成的任何 MSI 日志,或者可能在 Windows 事件日志中挖掘错误事件。

答案3

在 PowerShell 中,将直接调用的结果通过管道传输到某个地方:

msiexec /i my.msi /qn | Out-Null

或者使用Start-Process使用-Wait参数:

Start-Process msiexec -ArgumentList "/i my.msi /qn" -Wait

答案4

成功安装将返回以下 3 个代码中的任意一个:0、1641、3010,具体取决于重新启动选项。请尝试修改您的脚本,使其返回这些代码。

相关内容