Powershell 比较始终显示相等的两个VMHostVirtualSwitch

Powershell 比较始终显示相等的两个VMHostVirtualSwitch,powershell,vmware,powershell-3.0,powershell-4.0,powercli,Powershell,Vmware,Powershell 3.0,Powershell 4.0,Powercli,我将预先确定的对象(VMHostVirtualSwitch名称)值与对象集合中的所有对象(VMHostVirtualSwitch名称)值进行比较,如果对象不匹配,则希望状态为“失败” 到目前为止,我已经编写了以下代码,但它似乎不起作用。我知道对象不匹配,我应该得到“FAIL”作为输出 $VMHostVirtualSwitch = Get-VMHostNetwork -VMHost abc.com | Select-Object VirtualSwitch* $Cluster = Get-Clus

我将预先确定的对象(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     

问题是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
也是一种方法,尤其是当您正在比较多个属性时:。既然我们只讨论简单的字符串,我想我的建议就足够了

我不知道虚拟开关的类型是什么?我这样问是因为PowerShell可能只是比较类型,而不是对象数据。在这两种情况下,您最好都展开属性->
|选择对象-展开VirtualSwitch
,这样您就可以直接针对这些值进行操作。如果该类型不支持比较运算符,您可能仍然需要手动执行此操作。我已编辑了我的问题,并且能够
展开该值
。我怎样才能只比较
虚拟交换机名称
?啊,好的。这就是问题所在。PowerShell不知道如何比较对象。您也可以扩展名称
Select Object-expand VirtualSwitch | Select Object-expand name
(Get-VMHostNetwork-VMHost abc.com).VirtualSwitch.name
但是您能返回多个开关吗?总是一个开关我找不到真正解释这里发生了什么的“文章”。基本上,VMware从未向PowerShell提供有关如何比较此处对象的知识。