如何通过远程控制自动化WUSA部署并解决无Wait命令问题
远程自动化部署KB补丁(解决WUSA无原生Wait命令问题)
场景与执行流程
我们的目标是获取本地KB文件列表,通过WUSA工具在远程目标机器上自动化执行安装,具体流程如下:
- 建立与目标计算机的PowerShell会话
- 循环遍历本地存储的所有KB补丁文件
- 远程调用WUSA执行补丁安装
- 等待当前补丁安装完成后再处理下一个
- 安装完成后提供即时重启或定时重启的选项
完整PowerShell实现代码
# 设置会话错误处理策略 $ErrorActionPreference = "continue" # 获取C:\WinPatch目录下所有.msu格式的补丁文件 $PatchList = (Get-ChildItem -Path C:\WinPatch -Recurse | Where-Object {$_.Extension -eq '.msu'}) # 循环遍历每个补丁文件 foreach ($Patch in $PatchList) { Try { Write-Host ("`n 准备安装补丁: " + $Patch.Name) -ForegroundColor Yellow Write-Host ("`n 正在安装...") -ForegroundColor Magenta # 定义远程执行的脚本块:用Start-Process的-Wait参数实现安装等待 $SB = { $arglist = "$using:Patch.FullName", "/quiet", "/norestart" Start-Process -FilePath "C:\windows\system32\wusa.exe" -ArgumentList $arglist -Wait } # 远程执行脚本块(需确保已建立信任连接) Invoke-Command -ScriptBlock $SB Write-Host "`n 补丁安装完成`n" -ForegroundColor Green } Catch { Write-Host "安装失败,错误信息: $_" -ForegroundColor Red $Error.Clear() } } # 重启选项处理 $Ans1 = Read-Host "`n 是否立即重启计算机?(输入Y确认,N取消)" if ($Ans1 -eq 'Y' -or $Ans1 -eq 'y') { # 清理本地补丁文件 Remove-Item -Path C:\WinPatch\*.msu -Force Write-Host "`n 计算机将在5秒后重启..." -ForegroundColor Yellow Start-Sleep -Seconds 5 Restart-Computer -Force } else { # 检测PowerShell版本,判断是否支持定时重启 $PSVersion = (test-wsman -ComputerName localhost).ProductVersion if ($PSVersion.EndsWith("1.0") -or $PSVersion.EndsWith("2.0")) { Write-Host "`n 当前计算机安装的是PowerShell v1.0/v2.0,无法通过脚本定时重启,请手动打开任务计划程序设置" -ForegroundColor Red Read-Host "`n 按回车键继续..." } else { # 配置定时重启任务 Import-Module PSScheduledJob $RestartTime = Read-Host -Prompt "`n 请输入重启时间,格式为:mm/dd/yyyy hh:mmAM/PM" $Confirm = Read-Host -Prompt "`n 你输入的时间是: $RestartTime,确认请输入Y" if ($Confirm -eq 'Y' -or $Confirm -eq 'y') { $JobName = Read-Host -Prompt "`n 请输入定时重启任务的名称" $Trigger = New-JobTrigger -Once -At $RestartTime Register-ScheduledJob -Name $JobName -Trigger $Trigger -ScriptBlock { Restart-Computer -Force } -RunAs32 Write-Host "`n 定时重启任务已创建成功" -ForegroundColor Green } else { Write-Host "`n 请重新运行脚本并尝试设置" -ForegroundColor Red } } }
关键功能说明
- 解决WUSA无Wait命令问题:通过
Start-Process -Wait参数强制等待WUSA安装完成,避免脚本提前执行后续逻辑 - 远程执行逻辑:使用
Invoke-Command传递脚本块到目标机器,通过$using:关键字正确引用本地补丁文件变量 - 错误捕获:Try/Catch块捕获安装异常并输出明确错误信息,避免脚本意外中断
- 灵活重启选项:支持即时重启,同时根据PowerShell版本适配定时重启方案,低版本PS会给出手动操作指引
- 补丁清理:即时重启前自动清理本地补丁文件,节省存储空间
内容的提问来源于stack exchange,提问作者Grey Larkan
相关产品推荐
相关产品推荐

