PowerShell并行处理排序后文件并保留输入顺序的方法
解决PowerShell并行生成文件哈希并保持输入顺序的方案
要实现并行处理文件哈希且结果与输入文件顺序一致,核心是保留原始输入的顺序索引,并行处理时携带索引,最后按索引排序还原顺序。具体实现如下:
改进后的代码
Get-ChildItem -Recurse -Force -File ` | Sort-Object -Property 'FullName' ` | Select-Object -Property *, @{Name='Index'; Expression={[ref]$script:index++}.Value} ` | ForEach-Object -ThrottleLimit 10 -Parallel { $hash = & digest.exe $_.FullName [PSCustomObject]@{ Index = $_.Index HashResult = $hash FilePath = $_.FullName } } ` | Sort-Object -Property Index ` | Select-Object -ExpandProperty HashResult
代码说明
- 添加顺序索引:通过
Select-Object的计算属性给每个文件分配唯一递增的Index,记录原始排序后的位置。 - 并行处理携带索引:并行块中执行
digest.exe生成哈希,同时将Index、哈希结果和文件路径封装为自定义对象输出,确保每个结果都能追溯到原始位置。 - 按索引还原顺序:收集所有并行结果后,再次按
Index排序,最后提取哈希结果,得到与输入文件顺序完全一致的输出。
补充说明
如果需要同时保留文件路径和哈希的对应关系,可以去掉最后一步的Select-Object -ExpandProperty HashResult,直接使用包含Index、HashResult和FilePath的对象集合,方便后续关联处理。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

