比较两个始终显示相等的VMHostVirtualSwitches

时间:2018-06-19 18:55:46

标签: powershell vmware powershell-v3.0 powershell-v4.0 powercli

我正在将预定的对象(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 个答案:

答案 0 :(得分:2)

您的问题是PowerShell不知道如何比较那些对象。即使它们具有相同的数据,从技术上来说它们还是两个不同的对象(a blog post touches on this subject)。归根结底,如果您只是比较名称,则仅对名称进行比较。

$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也是解决问题的一种方法,尤其是当您要比较多个属性时:example。由于我们精简为简单的字符串,因此我认为我的建议就足够了。