PowerShell Get-WindowsUpdate用Select-Object筛选输出异常解决方法
Get-WindowsUpdate 无法直接读取KB/Title属性的解决方案
出现属性读取失败的核心原因:PSWindowsUpdate模块的Get-WindowsUpdate返回对象中,KB编号、更新分类信息没有放在顶层字段,直接选择KB属性读到的是空值,实际数据嵌套在对象的子属性中。
提取KB编号与更新标题的正确写法
直接遍历返回对象,从嵌套属性里取值即可,驱动、固件类更新大多没有关联KB编号,脚本里做了空值兼容:
Get-WindowsUpdate | ForEach-Object { [PSCustomObject]@{ KB = if ($_.KBArticleIDs.Count -ge 1) { "KB$($_.KBArticleIDs[0])" } else { "无关联KB" } 标题 = $_.Title 更新大小 = $_.Size 更新分类 = $_.Categories[0].Name } }
过滤驱动/固件类更新
你当前返回的全是驱动类更新,加个分类过滤条件即可筛出非驱动的系统更新:
# 过滤掉驱动、固件类更新,仅保留常规系统更新 Get-WindowsUpdate | Where-Object { $_.Categories[0].Name -notmatch "Driver|Firmware" } | ForEach-Object { [PSCustomObject]@{ KB = if ($_.KBArticleIDs.Count -ge 1) { "KB$($_.KBArticleIDs[0])" } else { "无关联KB" } Title = $_.Title } }
适配自动发邮件提醒脚本
可以直接把过滤后的更新列表存为变量,检测到有可用更新时就触发邮件发送,参考逻辑:
# 获取所有非驱动类的待安装更新 $pendingUpdates = Get-WindowsUpdate | Where-Object { $_.Categories[0].Name -notmatch "Driver|Firmware" } | ForEach-Object { [PSCustomObject]@{ KB = if ($_.KBArticleIDs.Count -ge 1) { "KB$($_.KBArticleIDs[0])" } else { "无关联KB" } Title = $_.Title } } # 检测到有更新时发邮件 if ($pendingUpdates.Count -gt 0) { # 将更新列表转为HTML表格作为邮件正文 $emailBody = $pendingUpdates | ConvertTo-Html -As Table -Property KB,Title | Out-String # 在这里补充Send-MailMessage的发件人、收件人、SMTP服务器配置即可 }
常见问题排查
- 如果执行时提示找不到
Categories或KBArticleIDs属性,先更新PSWindowsUpdate模块到最新版,旧版本模块存在属性结构不一致的问题,执行下面的命令更新后重启PowerShell即可:
Install-Module PSWindowsUpdate -Force -AllowClobber
- 部分驱动、硬件相关更新确实没有绑定微软KB编号,属于正常情况,不需要额外处理。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

