iT邦幫忙

DAY 18
3

強而有力的 Windows PowerShell系列 第 18

使用 Windows PowerShell 查看已經安裝的 Hotfix

延續上次的主題:「使用 Windows PowerShell 找出由 Windows Installer 所安裝的軟體」,這次要分享如何查看已經安裝的 Hotfix。
如同之前分享的強而有力的 Windows PowerShell 系列文章中,所提到的一個觀念:很多的 cmdlet 都有提供 ComputerName 參數來指定是本機或遠端電腦。如果沒有特別指定,預設值就是本機電腦。

同樣的用來查看已經安裝的 Hotfix 的 Get-HotFix cmdlet 也不例外,如果是要查詢遠端電腦的話,ComputerName 參數就可用 電腦名稱、IP 位址或是完整網域名稱。請注意,即使沒有將電腦設定成可執行遠端命令,也可以使用 Get-HotFixComputerName 參數哦!不過要用 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

上一篇
使用 Windows PowerShell 找出由 Windows Installer 所安裝的軟體
下一篇
使用 Windows PowerShell 鎖定本機電腦
系列文
強而有力的 Windows PowerShell33
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言