PowerShell中Select-Object -Unique如何取反,查找重复校验和
问题原因
- 原代码中
$HashesDouble = $arrDouble | Where-Object {$_.count -gt 1}的逻辑存在错误:管道传递到Where-Object的$_是数组中的单个校验和字符串,单个字符串的Count属性不代表该值在整个数组中的出现次数,因此判断条件永远不成立,无法筛选出重复条目。
筛选重复条目的实现方法
方法1:使用Group-Object(兼容性最佳,适配绝大多数场景)
直接对数组元素按值分组,筛选出元素数量大于1的分组即可得到重复项:
$arrDouble = "37B8525F4EE3571AA43F0F61C64060D5", "37B8525F4EE3571AA43F0F61C64060D5", "1E7100E795F6B84778EE0C6795AC8E32" # 仅获取去重后的重复值(每个重复值仅返回1次,对应Select-Object -Unique的取反效果) $HashesDouble = $arrDouble | Group-Object | Where-Object Count -gt 1 | Select-Object -ExpandProperty Name # 如果需要保留所有重复的实例(比如示例中2条相同的校验和都返回),替换为下面的写法 # $HashesDouble = $arrDouble | Group-Object | Where-Object Count -gt 1 | Select-Object -ExpandProperty Group $HashesDouble
运行后输出结果为重复的校验和:37B8525F4EE3571AA43F0F61C64060D5
方法2:使用哈希表统计次数(处理大量数据时效率更高)
通过哈希表统计每个值的出现次数,再筛选出次数大于1的值即可:
$arrDouble = "37B8525F4EE3571AA43F0F61C64060D5", "37B8525F4EE3571AA43F0F61C64060D5", "1E7100E795F6B84778EE0C6795AC8E32" $hashCounter = @{} $arrDouble | ForEach-Object { $hashCounter[$_]++ } $HashesDouble = $hashCounter.Keys | Where-Object { $hashCounter[$_] -gt 1 }
内容的提问来源于stack exchange,提问作者user3732793
相关产品推荐
相关产品推荐

