如何修改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
相关产品推荐
相关产品推荐

