PowerShell按Bytes属性分组自定义对象异常,求正确实现方法
解决PowerShell按字节数组属性分组异常的问题
问题原因
你遇到的问题核心是:Group-Object默认将数组类型(System.Object[])当作引用类型进行比较。哪怕两个数组的字节内容完全一致,它们在内存中的引用地址不同,就会被判定为不同的分组键,最终导致所有对象被分到同一组。
解决方案
要实现按字节数组的内容分组,需要将数组转换为能体现内容唯一性的标量类型(比如字符串、哈希值)作为分组依据,具体有两种常用方式:
方式1:将字节数组转为字符串(简单高效)
通过脚本块把Bytes数组转成逗号分隔的字符串,内容相同的数组会生成完全一致的字符串,从而正确分组:
# 基础分组命令 $mya | Group-Object -Property { $_.Bytes -join ',' }
如果需要让输出格式和你预期的完全匹配(Name列显示原数组样式,Group列只显示文件名),可以再加工输出对象:
$mya | Group-Object -Property { $_.Bytes -join ',' } | ForEach-Object { [PSCustomObject]@{ Count = $_.Count Name = $_.Group[0].Bytes Group = $_.Group.Name } }
方式2:计算字节数组的哈希值(适合大数组)
如果字节数组长度很大,转字符串可能占用过多内存,可以计算数组内容的哈希值作为分组键:
$mya | Group-Object -Property { $hashProvider = [System.Security.Cryptography.SHA256]::Create() [BitConverter]::ToString($hashProvider.ComputeHash($_.Bytes)) } | ForEach-Object { [PSCustomObject]@{ Count = $_.Count Name = $_.Group[0].Bytes Group = $_.Group.Name } }
预期输出效果
执行上述加工后的命令,会得到你期望的结果:
Count Name Group ----- ---- ----- 1 {105, 109, 112, 111, ...} {.\filedata.py} 2 {100, 102, 115, 97, ...} {.\testfile.txt, .\copyfile.txt}
内容的提问来源于stack exchange,提问作者ITDecrypted
相关产品推荐
相关产品推荐

