PowerShell无法显示重复文件大小问题求助
问题原因
你遇到的Length列为空的问题,核心原因是**Get-FileHash命令会将输入的文件对象转换为仅包含Hash、Algorithm、Path属性的FileHash类型对象**,原始文件对象的Length属性在这个转换过程中丢失了,所以后续再选择Length时自然没有数据。
解决方法
只需要在获取文件哈希的同时,保留原始文件对象的Length属性即可,以下是两种可行的修改方案:
方案一:通过自定义对象合并属性
这种方法直观易懂,手动将原始文件的Length、Path与哈希结果结合:
$srcDir = "C:\Users\test\Documents\folder" Get-ChildItem -Path $srcDir -File -Recurse | Group-Object -Property Length | Where-Object { $_.Count -gt 1 } | Select-Object -ExpandProperty Group | ForEach-Object { $fileHash = $_ | Get-FileHash [PSCustomObject]@{ Path = $_.FullName Length = $_.Length Hash = $fileHash.Hash } } | Group-Object -Property Hash | Where-Object { $_.Count -gt 1 } | ForEach-Object { $_.Group | Select-Object Path, Length }
方案二:使用计算属性保留原始属性
通过Select-Object的计算属性嵌入哈希值,同时保留原始文件的Length:
$srcDir = "C:\Users\test\Documents\folder" Get-ChildItem -Path $srcDir -File -Recurse | Group-Object Length | Where-Object Count -gt 1 | Select-Object -ExpandProperty Group | Select-Object FullName, Length, @{Name='Hash'; Expression={ (Get-FileHash $_.FullName).Hash }} | Group-Object Hash | Where-Object Count -gt 1 | ForEach-Object { $_.Group | Select-Object @{Name='Path'; Expression={$_.FullName}}, Length }
关键说明
两种方案的核心逻辑一致:在Get-FileHash处理前/处理时,将原始文件的Length属性保留下来,避免因对象转换导致属性丢失。执行修改后的脚本,就能同时显示重复文件的路径和大小了。
内容的提问来源于stack exchange,提问作者KaKouss Night
相关产品推荐
相关产品推荐

