延續上次的主題:「使用 Windows PowerShell 找出由 Windows Installer 所安裝的軟體」,這次要分享如何查看已經安裝的 Hotfix。
如同之前分享的強而有力的 Windows PowerShell 系列文章中,所提到的一個觀念:很多的 cmdlet 都有提供 ComputerName 參數來指定是本機或遠端電腦。如果沒有特別指定,預設值就是本機電腦。
同樣的用來查看已經安裝的 Hotfix 的 Get-HotFix cmdlet 也不例外,如果是要查詢遠端電腦的話,ComputerName 參數就可用 電腦名稱、IP 位址或是完整網域名稱。請注意,即使沒有將電腦設定成可執行遠端命令,也可以使用 Get-HotFix 的 ComputerName 參數哦!不過要用 Get-HotFix 取得遠端電腦的更新,要有其他額外的設定,例如要可以透過 RPC 與電腦進行溝通,這些設定就不在此討論了。
另外要注意的是,從 Windows Vista 開始,Get-HotFix 只會傳回作業系統的小型全系統更新,簡單地說,所列出的更新,不包含 Windows Installer 或 Windows Update 網站所提供的更新。更白話一點的說法是,Get-HotFix 所輸出的結果會因不同的作業系統而異。
以下面的這個命令來說,會列出本機電腦上的所有 Hotfix:
cls
Write-Host "查詢中...`n請稍候..."
Get-HotFix
如果我們希望 Hotfix 要依照安裝日期與 HotFixID 以遞減順序排序,只要加上排序的 Sort-Object cmdlet 即可。再進一步衍伸出,只要找出最後安裝的 Hotfix,但 HotFixID 卻又要最小。要怎麼做呢?當然還是要先會找出所有的 Hotfix,接著以遞減順序排序 HotFixID 的值,採遞增排序 InstalledOn 的值,最後選取陣列中的最後一個項目。
另外一種做法則是使用另一個管線運算子將結果傳送給 Select-Object cmdlet,讓最後的結果只顯示清單中的後 1 個項目。
cls
Write-Host "依照安裝日期與 HotfixID 以遞減順序排序"
Get-HotFix | Sort-Object InstalledOn, HotFixID -Descending
Write-Host "`n找出最後安裝的 Hotfix:方法 1"
(Get-HotFix | Sort-Object `
@{Expression="HotFixID";Descending=$true}, `
@{Expression="InstalledOn";Descending=$false} `
)[-1]
Write-Host "`n找出最後安裝的 Hotfix:方法 2"
Get-HotFix | Sort-Object `
@{Expression="HotFixID";Descending=$true}, `
@{Expression="InstalledOn";Descending=$false} | `
Select-Object -Last 1
附註:因為要以遞減順序排序 HotFixID 屬性,而 InstalledOn 卻以遞增順序進行排序,就必須使用雜湊的方式來指定屬性值。這樣的做法在「Windows PowerShell 基本操作 - 將執行的結果格式化」已經分享過了,請自個看看。
假設要找出電腦名稱為 alexc,說明欄位有 Update 的所有 Hotfix,可使用如下的指令:
cls
# 設定變數
$strComputer = "alexc"
Write-Host "查詢中...`n請稍候..."
Get-HotFix -ComputerName $strComputer -Description *Update*
如果微軟發布了一個一定要更新的 HotFix,其編號為 KB974571,要列出遺漏該 HotFix 更新之電腦名稱清單,可以先建立一份所有電腦的清單,使用Get-Hotfix 在列於清單中的電腦中,找出是否有 KB974571 的 HotFix。如果某台電腦沒有該 HotFix,就用 Add-Content 將電腦名稱寫入 No-KB974571.txt 檔案:
$pcList = "PC_List.txt"
$outFile = "No-KB974571.txt"
# 讀取電腦清單
$pc = Get-Content $pcList
# 檢查檔案是否存在
if($(Test-Path -Path $outFile) -eq "True") {
# 刪除舊的結果檔
Clear-Content -Path $outFile -Force
}
# 檢查是否有 KB974571 的 HotFix
$pc | foreach {`
if ( !(Get-HotFix -Id KB974571 -ComputerName $_) ) {`
Add-Content $_ -Path $outFile}`
}
有電腦清單檔 PC_List.txt 之內容可能如下:
alexc
srv_ap1
192.168.1.11
192.168.1.24
mail.alexc.idv.tw
提醒各位,執行上面的指令可能會出現如下的錯誤訊息,那是正常的,因為還沒安裝該更新,自然會出錯啊:
Get-HotFix : 這個命令在電腦 'srv_ap1' 上找不到 Hot-fix。請確認輸入,然後重新執行命令。
位於 C:\CheckHotFixAllComputers.ps1:15 字元:20
+ if ( !(Get-HotFix <<<< -Id KB974571 -ComputerName $_) ) {`
+ CategoryInfo : ObjectNotFound: (:) [Get-HotFix], ArgumentException
+ FullyQualifiedErrorId : GetHotFixNoEntriesFound,Microsoft.PowerShell.Commands.GetHotFixCommand