PowerShell中Wait-Process配合Start-Process失效,GAM安装等待方案咨询
解决方案
你之前的写法报错是因为Start-Process默认不会输出进程对象到管道,所以Wait-Process接收不到输入参数才触发错误。可以用以下几种方法实现等待MSI安装完成的效果:
- 方法1:修复原
Wait-Process写法
给Start-Process加上-PassThru参数,强制输出进程对象到管道即可:
# 替换原来的安装启动行 Start-Process -Filepath "C:\Temp\GAMadv-xtd3-$latest-windows-x86_64.msi" -ArgumentList "/passive" -PassThru | Wait-Process -Timeout 75
- 方法2:使用
Start-Process自带的-Wait参数(更简洁)
不需要借助管道,直接在启动进程时指定等待进程退出后再执行后续代码,还可以搭配-NoNewWindow避免弹出额外窗口:
Start-Process -Filepath "C:\Temp\GAMadv-xtd3-$latest-windows-x86_64.msi" -ArgumentList "/passive" -Wait -NoNewWindow
如果需要保留超时逻辑,也可以加-TimeoutSeconds参数(PowerShell 7.0+版本支持):
Start-Process -Filepath "C:\Temp\GAMadv-xtd3-$latest-windows-x86_64.msi" -ArgumentList "/passive" -Wait -NoNewWindow -TimeoutSeconds 75
- 方法3:自定义轮询判断(兼容低版本PowerShell的超时方案)
如果用的是PowerShell 5.1及更早版本,又需要自定义超时,可以手动获取进程对象轮询状态:
$installProcess = Start-Process -Filepath "C:\Temp\GAMadv-xtd3-$latest-windows-x86_64.msi" -ArgumentList "/passive" -PassThru $waitTime = 0 while (!$installProcess.HasExited -and $waitTime -lt 75) { Start-Sleep -Seconds 1 $waitTime++ } # 超时后可以选择强制结束进程 if (!$installProcess.HasExited) { $installProcess.Kill() Write-Warning "安装超时已强制终止" }
注意:运行该升级脚本需要提前获取管理员权限,否则MSI安装过程会因为UAC权限不足失败;另外建议执行下载前先判断
C:\Temp目录是否存在,不存在则提前创建,避免下载报错。
内容的提问来源于stack exchange,提问作者dcaz
相关产品推荐
相关产品推荐

