Start-Process -Wait未等待SCCM客户端安装完成的问题
解决Start-Process等待SCCM客户端安装完成的问题
这个问题我之前也碰到过,根源在于ccmsetup.exe并不是直接执行安装的进程——它其实是一个启动器,会启动真正负责安装的子进程,然后自己很快(大概5秒左右)就退出了。而Start-Process -Wait只会等待它直接创建的那个父进程结束,所以脚本会提前继续执行,而任务管理器里的是还在运行的子进程。
下面给你两个可靠的解决方案:
方法1:监控ccmsetup进程直到全部结束
ccmsetup启动器退出后,实际的安装工作会由它启动的另一个ccmsetup.exe进程完成,我们可以循环检测系统中是否还有这个进程,直到全部结束:
# 启动SCCM客户端安装程序 Start-Process -FilePath C:\temp\SCCM_Client\ccmsetup.exe -ArgumentList SMSSITECODE=PCM -NoNewWindow # 循环等待所有ccmsetup进程终止 do { # 每10秒检查一次 Start-Sleep -Seconds 10 $ccmRunning = Get-Process -Name ccmsetup -ErrorAction SilentlyContinue } while ($ccmRunning) Write-Host "Verify SCCM client install after reboot"`r`n -ForegroundColor Green
方法2:监控ccmsetup安装日志(更可靠)
SCCM客户端安装会在C:\Windows\ccmsetup\Logs\ccmsetup.log中记录详细过程,当安装完成时,日志会出现Installation completed successfully的条目。我们可以监控这个日志直到出现该关键字:
# 启动SCCM客户端安装程序 Start-Process -FilePath C:\temp\SCCM_Client\ccmsetup.exe -ArgumentList SMSSITECODE=PCM -NoNewWindow # 定义日志路径和完成标志 $logPath = "C:\Windows\ccmsetup\Logs\ccmsetup.log" $completionPattern = "Installation completed successfully" # 循环等待日志出现完成标志 do { Start-Sleep -Seconds 10 $installDone = Select-String -Path $logPath -Pattern $completionPattern -ErrorAction SilentlyContinue } while (-not $installDone) Write-Host "Verify SCCM client install after reboot"`r`n -ForegroundColor Green
为什么原来的-Wait参数没用?
再补充下原理:Start-Process -Wait的等待逻辑是绑定到它直接启动的进程ID上的,当这个父进程(也就是那个5秒就退出的ccmsetup启动器)终止时,Wait就会结束,完全不会关心它启动的子进程是否还在运行。这也是为什么你测试notepad.exe时正常——notepad是单进程程序,关闭它父进程就终止了,而ccmsetup是多进程的启动模式。
内容的提问来源于stack exchange,提问作者TelluRye
相关产品推荐
相关产品推荐

