如何在 Windows 上按哈希查找重复文件?
用 PowerShell 按 SHA256 哈希分组文件,在删除前确认副本完全相同。
快速开始
重复的照片、下载文件和文档会在 Windows 上悄悄占用大量空间。逐个文件计算哈希并分组,是找出真正重复文件(而不仅仅是同名文件)的可靠方法。本指南只用系统自带的 PowerShell 和 cmd 工具,无需安装额外软件。
症状
先看空间被什么占用
先列出用户文件夹里最大的文件。这样能知道哪些文件夹值得扫描重复项,避免对整个磁盘做无谓的哈希计算。把示例路径换成你自己的顶层文件夹。如果最大的文件都集中在一个项目或照片文件夹,下一步就扫描那个文件夹。成功时会得到一份简短的大文件列表及其完整路径。
按大小从大到小递归列出文件,快速定位占用磁盘空间的大文件。
$ Get-ChildItem -Path C:\Users\me -Recurse -File | Sort-Object Length -Descending | Select-Object -First 20 Length, FullName按 SHA256 分组找出重复文件
这是核心步骤:PowerShell 会对你指定的文件夹下所有文件计算哈希,并把哈希相同的文件分到一组。把示例路径换成上一步找到的文件夹,或你怀疑有重复的文件夹。输出会显示每个重复分组及其完整路径和哈希。成功时会看到 Count 大于 1 的分组;同一组内的文件内容相同。请查看每个分组并决定保留哪一份,但先不要删除。
通过 Get-FileHash 计算 SHA256 哈希并用 Group-Object 分组,找出内容完全相同的重复文件,方便清理磁盘。
$ $files = Get-ChildItem 'C:\Users\me\Pictures' -Recurse -File
$files | Get-FileHash -Algorithm SHA256 |
Group-Object Hash | Where-Object Count -gt 1 |
ForEach-Object { $_.Group | Select-Object Path, Hash } | Format-Table -AutoSize删除前逐字节确认一对文件
从上一步的重复分组中选一组,对你要比较的两个完整路径使用系统自带的逐字节比较工具。把示例文件名换成该重复分组中的确切路径。这个逐字节检查能发现路径弄错的情况,并确认文件确实完全相同。成功时会报告没有差异。看到这个结果后,再删除多余副本,保留你选定的那一份。
Windows 内置的文件比较工具可以判断文本或二进制文件是否一致,并精确列出每个不同字节的十六进制偏移。
$ fc /b file1.bin file2.bin如何确认已解决
你应该能看到一个或多个分组,组内每个文件都有相同的 SHA256 哈希。删除多余副本后,重新运行分组命令,这些文件夹的重复项数量应降为零。
来源
- Get-ChildItem | Microsoft Learn依据: Microsoft documents Get-ChildItem with -Recurse and -File, and that FileInfo objects expose the Length property, which can be sorted with Sort-Object.
- Get-ChildItem - PowerShell依据: SS64 shows Get-ChildItem piped into Sort-Object and Select-Object to rank files, e.g. by file size.
- Get-FileHash依据: Get-FileHash computes the SHA256 hash of files piped in, so identical files produce identical hashes that can be grouped.
- Get-FileHash - SS64依据: Get-FileHash accepts pipeline input of FileInfo objects and supports SHA256 as the default algorithm.
- fc | Microsoft Learn依据: Microsoft documents fc /b as performing a binary comparison, displaying every differing byte with its offset.
- File Compare - fc - Windows CMD依据: SS64 lists fc switches including /b for binary comparison, /c to ignore letter case, and /n to show line numbers in ASCII mode.
最后验证: 2026-09-22