我正在尝试制作一个安装脚本。我想安装一个 .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-process
cmdlet 进行进程监控。
这些方法仅监视进程的存在,它们无法检查退出代码,因此无法知道进程是正常退出还是处于错误状态。为此,您必须处理您指定生成的任何 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,具体取决于重新启动选项。请尝试修改您的脚本,使其返回这些代码。