Сравнивая два 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
также можно было бы пойти на это, особенно если сравнивалось несколько свойств: пример. Поскольку мы сводимся к простым строкам, я думаю, что того, что я предлагаю, должно быть достаточно.