比较始终显示相等的两个 VMHostVirtualSwitch
Comparing two VMHostVirtualSwitches that always show equal
我正在将预定对象(VMHostVirtualSwitch 名称)值与对象集合中的所有对象(VMHostVirtualSwitch 名称)值进行比较,如果对象不匹配,我希望状态为 "FAIL"
到目前为止,我已经编写了以下代码,但它似乎无法正常工作。我知道对象不匹配,我应该得到 "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 不知道如何比较这些对象。即使它们具有相同的数据,它们在技术上也是两个不同的对象 (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
也是一种方法,尤其是当您比较多个属性时:。由于我们正在归结为简单的字符串,我认为我的建议应该足够了。
我正在将预定对象(VMHostVirtualSwitch 名称)值与对象集合中的所有对象(VMHostVirtualSwitch 名称)值进行比较,如果对象不匹配,我希望状态为 "FAIL"
到目前为止,我已经编写了以下代码,但它似乎无法正常工作。我知道对象不匹配,我应该得到 "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 不知道如何比较这些对象。即使它们具有相同的数据,它们在技术上也是两个不同的对象 (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
也是一种方法,尤其是当您比较多个属性时: