假设我有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
答案 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'