PowerShell哈希表数组输出异常:仅返回最后一台计算机补丁信息求助
PowerShell批量查询补丁状态脚本修正方案
问题根源
你遇到的哈希表数组仅返回最后一台计算机信息的问题,核心原因是循环里重复复用同一个哈希表对象。PowerShell中哈希表是引用类型,数组存储的是对象引用,所有元素指向同一个哈希表,最终只会保留最后一次循环的修改结果。
修正后的脚本
# 目标计算机列表 $computers = @("COMP1", "COMP2", "COMP3", "COMP4") # 需要查询的补丁编号 $targetKBs = @("KB5031043", "KB5031419") # 初始化结果存储数组 $results = @() foreach ($pc in $computers) { # 每次循环新建有序哈希表,避免引用复用 $pcResult = [ordered]@{ "计算机名称" = $pc "连接状态" = "未连接" "WinRM状态" = "未检测" } # 检测WinRM可用性 $winrmOK = Test-WSMan -ComputerName $pc -ErrorAction SilentlyContinue if ($winrmOK) { $pcResult["WinRM状态"] = "正常" try { # 建立远程会话 $session = New-PSSession -ComputerName $pc -ErrorAction Stop $pcResult["连接状态"] = "已连接" # 获取已安装补丁列表 $installedKBs = Get-HotFix -ComputerName $pc -ErrorAction Stop | Select-Object -ExpandProperty HotFixID # 逐个检查目标补丁状态 foreach ($kb in $targetKBs) { $pcResult[$kb] = if ($installedKBs -contains $kb) { "已安装" } else { "未安装" } } # 关闭远程会话 Remove-PSSession $session } catch { $pcResult["连接状态"] = "连接失败:$($_.Exception.Message)" # 补丁状态设为无法查询 foreach ($kb in $targetKBs) { $pcResult[$kb] = "无法查询" } } } else { $pcResult["WinRM状态"] = "异常" # 补丁状态设为无法查询 foreach ($kb in $targetKBs) { $pcResult[$kb] = "无法查询" } } # 转换为PS自定义对象后加入数组,确保列完整显示 $results += [PSCustomObject]$pcResult } # 输出格式化表格 $results | Format-Table -AutoSize
关键修正点
- 每次循环新建哈希表:用
[ordered]@{}在循环内创建独立对象,避免后续循环覆盖之前的结果。 - 转换为PSCustomObject:哈希表直接存入数组时,PowerShell会根据第一个元素属性生成列,转换为自定义对象能确保所有属性被识别,输出完整列。
- 补全所有属性:不管连接成功与否,都为每个补丁状态赋值,确保所有结果对象属性一致,表格能显示全部补丁列。
内容的提问来源于stack exchange,提问作者chathae
相关产品推荐
相关产品推荐

