如何验证Excel同一单元格中的两个Windows补丁?
系统补丁合规性验证脚本修复(支持Excel单元格多补丁)
问题
现有PowerShell脚本用于验证系统补丁合规性,但无法处理Excel同一单元格中包含多个补丁的场景(如单元格内容为KB123456, KB789012),导致验证逻辑失效。
原脚本
Install-Module -Name ImportExcel $data = Import-Excel C:\pATCHING\pATCHES.xlsx $Wupdate = get-wmiobject win32_quickfixengineering -ComputerName $env:computername if($Wupdate.HotFixID -eq $data[1].Patches) { write-Host "System is Compliant in patching parameter" -ForegroundColor Green } else { write-Host "System is Non-Compliant in patching parameter" -ForegroundColor Red }
问题分析
$Wupdate.HotFixID返回的是已安装补丁ID的数组,而$data[1].Patches是包含多个补丁的字符串,直接用-eq比较无法匹配。- 需要先将单元格中的补丁字符串拆分为单独的补丁ID数组,再逐一验证是否全部存在于已安装补丁列表中。
修复后的脚本
# 仅在模块未安装时导入ImportExcel if (-not (Get-Module -ListAvailable -Name ImportExcel)) { Install-Module -Name ImportExcel -Force -Scope CurrentUser } Import-Module ImportExcel # 导入Excel补丁数据 $excelData = Import-Excel -Path "C:\pATCHING\pATCHES.xlsx" # 获取本地已安装的所有补丁ID,转为哈希表提升查找效率 $installedPatches = @{} Get-WmiObject Win32_QuickFixEngineering -ComputerName $env:COMPUTERNAME | ForEach-Object { $installedPatches[$_.HotFixID] = $true } # 提取目标单元格的补丁字符串,拆分并清理空格 $requiredPatches = $excelData[1].Patches -split ',' | ForEach-Object { $_.Trim() } # 验证所有必填补丁是否已安装 $isCompliant = $true foreach ($patch in $requiredPatches) { if (-not $installedPatches.ContainsKey($patch)) { $isCompliant = $false Write-Host "缺失补丁: $patch" -ForegroundColor Yellow } } # 输出最终合规性结果 if ($isCompliant) { Write-Host "系统补丁合规" -ForegroundColor Green } else { Write-Host "系统补丁不合规" -ForegroundColor Red }
脚本说明
- 增加模块安装判断,避免重复执行安装操作。
- 使用哈希表存储已安装补丁,提升批量查找的效率。
- 拆分Excel单元格中的补丁字符串,去除多余空格,得到独立的补丁ID数组。
- 逐一验证每个必填补丁是否存在,缺失时单独提示。
- 最终根据验证结果输出清晰的合规性状态。
内容的提问来源于stack exchange,提问作者Sagar Mahto
相关产品推荐
相关产品推荐

