根据属性子集比较对象

时间:2014-12-23 19:39:16

标签: powershell powershell-v2.0

假设我有2个powershell哈希表一个大一个小,为了特定目的我想说它们是相等的如果对于小的键,大哈特斯特德的键是相同的。 另外我事先不知道钥匙的名字。我可以使用以下使用Invoke-Expression的函数,但我正在寻找更好的解决方案,不依赖于此。

Function Compare-Subset {
  Param(
      [hashtable] $big,
      [hashtable] $small
  )
  $keys = $small.keys
  Foreach($k in $keys) {
    $expression = '$val = $big.' + "$k" + ' -eq ' + '$small.' + "$k"
    Invoke-Expression $expression
    If(-not $val) {return $False}
  }
  return $True
}


$big = @{name='Jon'; car='Honda'; age='30'}
$small = @{name = 'Jon'; car='Honda'}

Compare-Subset $big $small

2 个答案:

答案 0 :(得分:2)

可以轻松获得简单的$ true / $ false。如果没有差异,这将返回$ true:

[string]::IsNullOrWhiteSpace($($small|Select -Expand Keys|Where{$Small[$_] -ne $big[$_]}))

它检查$ small中的所有键,以查看$ small中该键的值是否与$ big中该键的值相同。它只会输出任何不同的值。它包含在[String]类型的IsNullOrWhitespace()方法中,因此如果发现任何差异,则返回false。如果要列出差异,只需删除该方法。

答案 1 :(得分:0)

这可能是某事的开始。不确定您要查找的输出,但这将输出两组之间的差异。使用您提供的相同样本数据:

$results = Compare-Object ($big.GetEnumerator() | % { $_.Name }) ($small.GetEnumerator() | % { $_.Name })
$results | ForEach-Object{
    $key = $_.InputObject
    Switch($_.SideIndicator){
        "<="{"Only reference object has the key: '$key'"}
        "=>"{"Only difference object has the key: '$key'"}
    }
}

在黄金时段,您会想要不同的东西,但只是为了向您展示上面会产生以下输出:

Only reference object has the key: 'age'