PowerShell技术问询:基于变量$a对比$b,判断$a所有条目是否存在于$b
PowerShell 对比两个变量的条目存在性判断
需求:判断变量$a中所有Name与VLanId的组合条目是否全部存在于变量$b中,若全部存在则输出pass,否则输出fail。
示例数据
$a = @( [PSCustomObject]@{ Name = 'VM Network'; VLanId = 0 }, [PSCustomObject]@{ Name = 'VL600_ACC'; VLanId = 600 }, [PSCustomObject]@{ Name = 'VL602_SEC2'; VLanId = 602 } ) $b = @( [PSCustomObject]@{ Name = 'VM Network'; VLanId = 0 }, [PSCustomObject]@{ Name = 'VL600_ACC'; VLanId = 600 }, [PSCustomObject]@{ Name = 'VM-VLAN'; VLanId = 102 }, [PSCustomObject]@{ Name = 'VL602_SEC2'; VLanId = 602 } )
解决方案1:使用Compare-Object(直观易读)
利用PowerShell内置对比命令,直接找出$a中独有的条目,以此判断是否全部存在于$b:
# 找出仅存在于$a的条目 $missingEntries = Compare-Object -ReferenceObject $a -DifferenceObject $b -Property Name, VLanId -PassThru | Where-Object { $_.SideIndicator -eq '<=' } # 根据结果输出 if (-not $missingEntries) { Write-Output "pass" } else { Write-Output "fail" }
- 原理:
Compare-Object通过Name和VLanId两个属性对比对象,SideIndicator为<=的条目仅存在于$a中;如果没有这类条目,说明$a的所有组合都在$b里。
解决方案2:哈希表快速查找(高效适合大数据量)
通过构建$b的哈希表索引,快速校验$a的每个条目:
# 构建$b的组合索引哈希表 $bLookup = @{} foreach ($item in $b) { # 用Name和VLanId拼接成唯一键 $key = "$($item.Name)_$($item.VLanId)" $bLookup[$key] = $true } # 遍历$a检查每个条目是否存在 $allExist = $true foreach ($item in $a) { $key = "$($item.Name)_$($item.VLanId)" if (-not $bLookup.ContainsKey($key)) { $allExist = $false break } } # 输出结果 if ($allExist) { Write-Output "pass" } else { Write-Output "fail" }
- 原理:哈希表的键查找是O(1)操作,数据量较大时比
Compare-Object效率更高。
内容的提问来源于stack exchange,提问作者True Entertainer
相关产品推荐
相关产品推荐

