在 Windows Server 2008-R2 上使用以下命令有效:
Get-Hotfix -cn HOSTNAME | sort InstalledOn -des | select HotfixID, Description, InstalledOn -first 20
但它不适用于 Windows Server 2003(这并不奇怪)或 Server 2008 32 位(这对我来说很奇怪)。
当我在 32 位 Win 2008 服务器上运行此脚本时出现以下错误:
Sort-Object:异常设置“InstalledOn”:“使用“1”个参数调用“Parse”时发生异常:“字符串未被识别为有效的 DateTime。””
答案1
抛出错误是因为无法按日期/时间对它们进行排序,因为带有 InstalledOn 条目的修补程序无法解析为有效的日期/时间。
因此,您很可能在一台没有正确“安装日期”的机器上安装了 HotFixes,因此它只会返回这些条目的空白。
这并不特定于 Windows 的某个版本,因为我在 Windows 2012 R2 服务器上进行了测试,发现了同样的错误。
您可以通过运行不带排序的查询来确认 InstalledOn 日期:
Get-Hotfix -cn HOSTNAME | select HotfixID, Description, InstalledOn -first 20
例子:
PS C:\Windows\system32> Get-Hotfix | select HotfixID, Description, InstalledOn -first 20
HotfixID Description InstalledOn
-------- ----------- -----------
KB2868626 Security Update
KB2883200 Update
KB2887595 Update
KB2894852 Security Update 01Dec2015 12:00:00 AM
KB2896496 Update
KB2900986 Security Update
KB2903939 Update
KB2904440 Update
KB2911106 Update
KB2919355 Update 04Oct2014 12:00:00 AM
请注意,其中许多都没有显示任何内容InstalledOn
。
答案2
绝对不是最好的解决方案,但对我来说有效:
$lastHotFixInstallDate = Get-HotFix | Select-Object @{
'L' = 'installDate';
'E' = {
"{0}-{1:00}-{2:00}" -f `
[Int]$_.PSBase.Properties["installedon"].value.Split('/')[2], `
[Int]$_.PSBase.Properties["installedon"].value.Split('/')[0], `
[Int]$_.PSBase.Properties["installedon"].value.Split('/')[1]}
} | Sort-Object -Property installDate | Select-Object -Last 1
此解决方案利用了 $_.PSBase.Properties["installedon"].value 属性。由于此属性是 m/d/yyyy 格式的字符串,因此需要在 / 上手动拆分,然后对其进行排序。