You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改PowerCLI脚本获取所有ESXi主机的健康状态

解决PowerCLI获取所有ESXi主机健康状态时重复输出主机名的问题

你原本有一套能获取单台ESXi主机健康状态的PowerCLI脚本,修改为获取所有主机状态时,使用$VMHostName = (Get-View -ViewType HostSystem -Property Name,Config.Product).Name获取主机列表后,运行原脚本出现了重复输出所有主机名的异常情况,需要修正这个问题。

原单主机脚本

$VMHostName = "Host01"

$HostView = Get-VMHost -Name $VMHostName | Get-View
$HealthStatusSystem = Get-View $HostView.ConfigManager.HealthStatusSystem
$SystemHealthInfo = $HealthStatusSystem.Runtime.SystemHealthInfo
ForEach ($Sensor in $SystemHealthInfo.NumericSensorInfo) {
  $Report = "" | Select-Object VMHost,Sensor,Status
  $Report.VMHost = $VMHostName
  $Report.Sensor = $Sensor.Name
  $Report.Status = $Sensor.HealthState.Key
  $Report
}

原脚本正常输出示例

VMHost                                   Sensor                                                           Status
------                                   ------                                                                 ------
host01                                   PCI Bus 1 32-PCI 2-I/O mod --- Normal                              green 
host01                                   PCI Bus 1 30-PCI 1-I/O mod --- Normal                              green 
...

问题原因

  • 当$VMHostName变成主机名数组后,原脚本没有遍历每个主机,而是直接用数组执行后续逻辑
  • 在传感器循环中,$Report.VMHost = $VMHostName会把整个主机名数组赋值给每个传感器的VMHost字段,导致每条传感器记录都显示所有主机名,出现重复输出的异常

修正后的脚本

# 获取所有ESXi主机的对象列表
$allVMHosts = Get-VMHost

# 遍历每一台主机
foreach ($vmHost in $allVMHosts) {
    $HostView = $vmHost | Get-View
    $HealthStatusSystem = Get-View $HostView.ConfigManager.HealthStatusSystem
    $SystemHealthInfo = $HealthStatusSystem.Runtime.SystemHealthInfo

    # 遍历当前主机的所有传感器
    ForEach ($Sensor in $SystemHealthInfo.NumericSensorInfo) {
        $Report = "" | Select-Object VMHost,Sensor,Status
        $Report.VMHost = $vmHost.Name  # 赋值当前主机的名称,而非数组
        $Report.Sensor = $Sensor.Name
        $Report.Status = $Sensor.HealthState.Key
        $Report
    }
}

修正说明

  • 直接用Get-VMHost获取所有主机对象,避免单独提取名称数组导致的逻辑脱节
  • 增加外层循环遍历每一台主机,确保每个主机的传感器数据单独处理
  • 将$Report.VMHost赋值为当前循环的$vmHost.Name,保证每条记录只对应当前主机

正确输出示例

VMHost                                   Sensor                                                           Status
------                                   ------                                                                 ------
host01                                   PCI Bus 1 32-PCI 2-I/O mod --- Normal                              green 
host01                                   PCI Bus 1 30-PCI 1-I/O mod --- Normal                              green 
host02                                   CPU 0 Core Temperature                                              green 
host02                                   Power Supply 1 Status                                              green 
...

内容的提问来源于stack exchange,提问作者andrej_jan_work

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 01:12:43