如何高效比较Hashtable中存储的数组?无需遍历与硬编码键
PowerShell哈希表数组比较方法
作为PowerShell新手,你希望找到简洁高效的方法比较哈希表中存储的数组,尽量避免遍历数组和硬编码键。
你的示例哈希表
Key : somekey1 Value : {value1, value2, value3, value4} Name : somekey1 Key : somekey2 Value : {value1, value2, value3} Name : somekey2
哈希表创建代码(修正键名的引号问题)
$hashtable = @{} $hashtable['somekey1'] = @() $hashtable['somekey2'] = @() $hashtable['somekey3'] = @() foreach ($key in $hashtable.Keys) { $hashtable[$key] += 'value1' }
你尝试的命令不可行的原因
你写的命令:
Compare-Object $($hashtable.keys)[0] $($hashtable.keys)[1] -Property Value;
无法得到期望结果,因为$($hashtable.keys)[0]获取的是键名称(比如somekey1),而非对应的值数组,Compare-Object无法通过-Property Value来比较键名对象的Value属性。
正确的实现方法
1. 针对指定键的数组比较(半硬编码键)
直接提取对应键的值数组进行比较,提取差异元素:
$array1 = $hashtable['somekey1'] $array2 = $hashtable['somekey2'] Compare-Object -ReferenceObject $array1 -DifferenceObject $array2 | Select-Object -ExpandProperty InputObject
执行后会输出:
value4
2. 不硬编码键,比较前两个键的数组
如果不想写死键名,可以动态获取哈希表的键,取前两个对应的数组进行比较:
# 获取哈希表的前两个键 $targetKeys = $hashtable.Keys | Select-Object -First 2 # 提取对应的值数组 $targetArrays = $targetKeys | ForEach-Object { $hashtable[$_] } # 比较并输出差异元素 Compare-Object -ReferenceObject $targetArrays[0] -DifferenceObject $targetArrays[1] | Select-Object -ExpandProperty InputObject
说明
Compare-Object默认会返回包含差异项和来源的对象,通过Select-Object -ExpandProperty InputObject可以直接提取差异的元素值,符合你的期望输出。- 如果需要批量比较所有键的数组两两组合,还是需要遍历键对,但如果只是比较指定数量的键(比如前两个),上述方法无需硬编码键名。
内容的提问来源于stack exchange,提问作者Wiktor Kisielewski
相关产品推荐
相关产品推荐

