如何编写重启后可恢复、结果写入CSV的Win10更新PowerShell脚本
问题1:CSV生成失败修复
原有代码问题
- 变量未定义:判断条件中使用的
$WUTitle不存在,应该使用遍历更新历史的项属性$T.Title - 数据结构错误:你将
$RecentUpdatesString定义为哈希表,却直接写入普通字符串到文件,不符合CSV结构化格式要求 - 索引逻辑错误:外层循环计数
$UpdateCount和更新历史列表的索引不匹配,无法取到对应更新记录 - 操作冗余:不需要手动判断文件是否存在、删除重建,PowerShell内置的
Export-Csv命令可以直接生成合法CSV文件
修正后代码
# 可自定义更新查询的时间范围,单位天 $checkRangeDays = 14 $WUHistory = Get-WUHistory -MaxDate (Get-Date).AddDays(-$checkRangeDays) | Sort-Object -Property ComputerName,OperationName,Result,Date,Title $RecentUpdatesList = @() # 匹配待安装KB和更新历史记录 foreach ($kbId in $NeedUpdate) { $matched = $WUHistory | Where-Object {$_.Title -like "*$kbId*"} | Select-Object -First 1 if ($matched) { Write-Host "匹配到更新记录:$kbId" $RecentUpdatesList += $matched } } # 直接导出为CSV,Force参数自动覆盖已存在的旧文件 $csvPath = "C:\Users\$env:USERNAME\Documents\RecentUpdates.csv" $RecentUpdatesList | Export-Csv -Path $csvPath -NoTypeInformation -Encoding UTF8 -Force # 读取验证生成的CSV $RecentUpdatesCSV = Import-Csv -Path $csvPath
问题2:重启后继续运行更新的方案
优先选择计划任务方案,完全不需要修改注册表,是微软官方推荐的开机/重启后执行指定任务的实现方式,比修改注册表更安全、可控性更高,配置要点如下:
- 触发条件:选择「计算机启动时」,可设置延迟30秒执行,避免系统刚启动时更新服务未就绪
- 运行账户:选择
SYSTEM账户,勾选「使用最高权限运行」,保证更新操作有足够权限 - 操作配置:操作为「启动程序」,程序路径填
powershell.exe,参数填-ExecutionPolicy Bypass -NoProfile -File "你的脚本完整绝对路径.ps1" - 附加设置:勾选「任务失败后按以下频率重新启动」,设置间隔1分钟、重启3次,可根据需求勾选「唤醒计算机运行此任务」
脚本配套逻辑
可以在脚本中添加任务标记逻辑,避免不需要执行时重复跑脚本:
$pendingTagPath = "C:\temp\update_pending.tag" if (-not (Test-Path $pendingTagPath)) { # 首次执行:筛选发布超过2周的待安装更新,写入标记文件 $NeedUpdate = 你原有筛选待安装KB的逻辑 $NeedUpdate | Out-File $pendingTagPath -Encoding UTF8 } else { # 重启后执行:读取标记文件中待安装的KB列表 $NeedUpdate = Get-Content $pendingTagPath } # 此处放置你安装更新的原有逻辑 # 所有更新安装完成后清理标记和任务 if ($NeedUpdate.Count -eq 0) { Remove-Item $pendingTagPath -Force -ErrorAction SilentlyContinue # 自动删除对应计划任务,避免后续开机重复执行 Unregister-ScheduledTask -TaskName "你的计划任务名称" -Confirm:$false -ErrorAction SilentlyContinue }
内容的提问来源于stack exchange,提问作者Ryan_DT
相关产品推荐
相关产品推荐

