如何用PowerShell获取Windows最后更新日期并解决解析异常
解决PowerShell获取Windows最后更新日期的问题
问题原因分析
你遇到的String was not recognized as a valid DateTime错误,是因为部分机器上Get-HotFix返回的InstalledOn属性是无法被PowerShell解析为有效日期的字符串(可能由系统区域设置差异、热修复元数据损坏导致)。同时默认返回的日期会包含时间部分,需要格式化处理。
解决方案1:修复Get-HotFix的错误处理与日期格式化
通过过滤掉无法解析的日期条目,再对有效日期排序并格式化:
# 获取所有热修复,过滤掉InstalledOn无效的条目 $有效热修复 = Get-HotFix | Where-Object { try { [DateTime]$_.InstalledOn | Out-Null $true } catch { $false } } if ($有效热修复) { # 获取最新的安装日期并格式化为仅日期部分 $最后更新日期 = $有效热修复 | Sort-Object InstalledOn | Select-Object -Last 1 -ExpandProperty InstalledOn $格式化日期 = $最后更新日期.ToString('yyyy-MM-dd') # 可根据需求改为'MM/dd/yyyy'等格式 Write-Output $格式化日期 } else { Write-Output "未找到有效的更新日期记录" }
解决方案2:使用更可靠的Windows Update历史记录
如果Get-HotFix的结果不够准确,可通过Windows Update Agent COM对象获取官方更新历史,此方法能覆盖更多类型的更新(如累积更新):
try { $更新会话 = New-Object -ComObject Microsoft.Update.Session $更新搜索器 = $更新会话.CreateUpdateSearcher() $历史记录总数 = $更新搜索器.GetTotalHistoryCount() # 查询所有更新历史,筛选成功安装的条目并取最新一条 $最新成功更新 = $更新搜索器.QueryHistory(0, $历史记录总数) | Where-Object { $_.ResultCode -eq 2 # ResultCode=2表示安装成功 } | Sort-Object Date -Descending | Select-Object -First 1 if ($最新成功更新) { $格式化日期 = $最新成功更新.Date.ToString('yyyy-MM-dd') Write-Output $格式化日期 } else { Write-Output "未找到成功的更新历史记录" } } catch { Write-Output "获取更新历史时出错: $_" }
关键说明
- 日期格式化:
ToString('yyyy-MM-dd')会生成类似2024-05-20的纯日期字符串,可根据你的UI需求调整格式(如'yyyy年MM月dd日')。 - 错误处理:两种方案都加入了异常捕获,避免因个别无效记录导致整个脚本崩溃。
内容的提问来源于stack exchange,提问作者Callum Stones
相关产品推荐
相关产品推荐

