PowerShell实现SCCM可用软件更新循环安装及自动重启方案咨询
SCCM 季度补丁循环安装脚本优化方案
核心优化点
- 新增外层循环,每轮补丁安装完成后主动触发SCCM客户端更新评估,扫描依赖安装后新释放的可用补丁
- 修正原脚本语法错误(原No分支错误嵌套在Yes分支内)
- 新增循环次数限制,避免极端情况下死循环
- 连续两轮扫描无待安装补丁时,才进入最终重启判断
修改后完整脚本
Add-Type -AssemblyName PresentationCore, PresentationFramework switch ( [System.Windows.MessageBox]::Show( '此操作将下载并安装微软关键更新,可能会触发自动重启,是否继续?', '警告', 'YesNo', 'Warning' ) ) { 'Yes' { Start-Process -FilePath "C:\Windows\CCM\ClientUX\scclient.exe" "softwarecenter:Page=InstallationStatus" $installUpdateParam = @{ NameSpace = 'root/ccm/ClientSDK' ClassName = 'CCM_SoftwareUpdatesManager' MethodName = 'InstallUpdates' } $getUpdateParam = @{ NameSpace = 'root/ccm/ClientSDK' ClassName = 'CCM_SoftwareUpdate' Filter = 'EvaluationState < 8' } # 最大循环次数,避免死循环 $maxLoop = 10 $loopCount = 0 do { $loopCount++ # 主动触发SCCM更新评估,刷新可用补丁列表 Invoke-CimMethod -Namespace root/ccm/ClientSDK -ClassName CCM_SoftwareUpdatesManager -MethodName ScanForUpdates -Arguments @{ScanTrigger=1} Start-Sleep -Seconds 15 [ciminstance[]]$updates = Get-CimInstance @getUpdateParam if ($updates) { Invoke-CimMethod @installUpdateParam -Arguments @{ CCMUpdates = $updates } # 等待当前轮次补丁安装完成 while(Get-CimInstance @getUpdateParam){ Start-Sleep -Seconds 30 } } # 等待1分钟后再次扫描,确认是否有新释放的依赖补丁 Start-Sleep -Seconds 60 $remainingUpdates = Get-CimInstance @getUpdateParam } while ($remainingUpdates -and $loopCount -lt $maxLoop) # 所有补丁安装完成后判断是否需要重启 $rebootPending = Invoke-CimMethod -Namespace root/ccm/ClientSDK -ClassName CCM_ClientUtilities -MethodName DetermineIfRebootPending if ($rebootPending.RebootPending){ Invoke-CimMethod -Namespace root/ccm/ClientSDK -ClassName CCM_ClientUtilities -MethodName RestartComputer } } 'No' { Exit-PSSession } }
可选扩展(跨重启续跑)
如果补丁依赖链需要多次重启才能完成全量安装,可以新增以下逻辑:
- 脚本启动时检查是否存在未完成的补丁安装标记文件
- 若存在重启待处理状态,创建开机自动触发的计划任务运行该脚本
- 所有补丁安装完成后自动删除计划任务和标记文件
内容的提问来源于stack exchange,提问作者therway
相关产品推荐
相关产品推荐

