Сравнивая два VMHostVirtualSwitch, которые всегда показывают равные

Я сравниваю предопределенное значение объекта (имя VMHostVirtualSwitch) со всеми значениями объекта (имена VMHostVirtualSwitch) в коллекции объектов и хочу, чтобы статус был "Сбой", если объекты не совпадают

До сих пор я написал следующий код, но, похоже, он не работает. Я знаю, что объекты не совпадают, и я должен получить "FAIL" в качестве вывода

$VMHostVirtualSwitch = Get-VMHostNetwork -VMHost abc.com | Select-Object VirtualSwitch*
$Cluster = Get-Cluster -VMHost abc.com 
$VMHosts = Get-Cluster $Cluster | Get-VMHost
[int]$Switchcount=0

foreach ($VMHost in $VMHosts){
  $CurrentHostVirtualSwitch = Get-VMHostNetwork -VMHost $VMHost | Select-Object VirtualSwitch*
  if ($CurrentHostVirtualSwitch -ne $VMHostVirtualSwitch) {
   $Switchcount++
  }
}
if($Switchcount -ge 1) {
Write-Output "FAIL"
}

$VMHostVirtualSwitch имеет следующее значение

VirtualSwitch
-------------
{vSwitch3} 

Когда я расширяю $VMHostVirtualSwitch Я получаю следующие значения

Name                           NumPorts   Mtu   Notes                                             
----                           --------   ---   -----                                             
vSwitch3                       10562      2340     

1 ответ

Решение

Ваша проблема в том, что PowerShell не знает, как сравнивать эти объекты. Даже если у них были одни и те же данные, технически они представляют собой два разных объекта ( пост в блоге затрагивает эту тему). В конце дня, если вы просто сравниваете имена, сделайте сравнение только по этим именам.

$VMHostVirtualSwitch = (Get-VMHostNetwork -VMHost abc.com).VirtualSwitch.Name
$Cluster = Get-Cluster -VMHost abc.com 
$VMHosts = Get-Cluster $Cluster | Get-VMHost
[int]$Switchcount=0

foreach ($VMHost in $VMHosts){
    $CurrentHostVirtualSwitch = (Get-VMHostNetwork -VMHost $VMHost).VirtualSwitch.Name
    if ($CurrentHostVirtualSwitch -ne $VMHostVirtualSwitch) {
        $Switchcount++
    }
}

if($Switchcount -ge 1) {
    Write-Output "FAIL"
}

Теперь вам нужно просто сравнивать строки, которые дадут вам более предсказуемые результаты. Я только изменил расширение переменной в приведенном выше примере. Вы могли бы иметь некоторую проверку ошибок, чтобы сделать, чтобы учесть.

Что-то вроде этого может быть короче, чем ваша петля

$badHosts = $VMHosts | Where-Object{(Get-VMHostNetwork -VMHost $_).VirtualSwitch.Name -ne $VMHostVirtualSwitch}
if($badHosts.count -ge 1) {
    Write-Output "FAIL"
}

Compare-Object также можно было бы пойти на это, особенно если сравнивалось несколько свойств: пример. Поскольку мы сводимся к простым строкам, я думаю, что того, что я предлагаю, должно быть достаточно.

Другие вопросы по тегам