可利用PowerShell通过计算SHA256哈希值识别重复文件:一、遍历目录分组哈希值;二、导出结果至CSV;三、限定扩展名提升效率;四、自定义函数支持参数配置;五、排除符号链接避免误判。

如果您希望在Windows系统中快速识别并定位内容完全相同的文件,则可以利用PowerShell脚本通过计算文件哈希值来比对文件内容。以下是几种可直接运行的PowerShell方法:
一、使用Get-FileHash按目录扫描查找重复文件
该方法遍历指定路径下所有文件,为每个文件生成SHA256哈希值,并将相同哈希值的文件分组,从而识别内容重复的文件集合。
1、以管理员身份打开PowerShell。
2、执行以下命令,将C:\TargetFolder替换为您要扫描的实际路径:
3、Get-ChildItem -Path "C:\TargetFolder" -File -Recurse | ForEach-Object { $_ | Get-FileHash -Algorithm SHA256 } | Group-Object -Property Hash | Where-Object Count -gt 1 | ForEach-Object { $_.Group | Select-Object -Property Path, Hash }
二、导出重复文件列表到CSV文件
此方法在识别重复文件的同时,将结果保存为CSV格式,便于后续查看或筛选,避免控制台输出截断问题。
1、在PowerShell中输入以下命令,注意修改C:\TargetFolder和C:\Duplicates.csv为实际路径:
2、Get-ChildItem -Path "C:\TargetFolder" -File -Recurse | Get-FileHash -Algorithm SHA256 | Group-Object Hash | Where-Object Count -gt 1 | ForEach-Object { $_.Group | Select-Object Path, Hash } | Export-Csv -Path "C:\Duplicates.csv" -NoTypeInformation -Encoding UTF8
三、仅比较特定扩展名的文件
为提升效率并减少误匹配,可限制脚本仅处理常见文档或媒体类型(如.jpg、.pdf、.docx),跳过系统文件或临时文件。
1、运行以下命令,其中@("*.jpg","*.png","*.pdf","*.docx")可根据需要增删扩展名:
2、$Extensions = @("*.jpg","*.png","*.pdf","*.docx"); Get-ChildItem -Path "C:\TargetFolder" -Include $Extensions -File -Recurse | Get-FileHash -Algorithm SHA256 | Group-Object Hash | Where-Object Count -gt 1 | ForEach-Object { $_.Group | Select-Object FullName, Length, LastWriteTime }
四、使用自定义函数实现更灵活的重复检测
该方案封装为可复用函数,支持指定路径、算法、排除目录及最小文件大小阈值,增强实用性与可控性。
1、在PowerShell中定义函数:
2、function Find-DuplicateFiles { param([string]$Path, [string]$Algorithm = "SHA256", [int]$MinSize = 0); Get-ChildItem $Path -File -Recurse | Where-Object { $_.Length -ge $MinSize } | Get-FileHash -Algorithm $Algorithm | Group-Object Hash | Where-Object Count -gt 1 | ForEach-Object { $_.Group | Select-Object FullName, Length, Hash } }
3、调用函数,例如查找大于1KB的重复文件:
4、Find-DuplicateFiles -Path "C:\TargetFolder" -MinSize 1024
五、跳过符号链接与硬链接以避免误判
PowerShell默认会解析符号链接指向的目标文件,可能导致同一物理文件被多次计入。启用-FollowSymlink参数控制行为可规避该问题。
1、若需忽略符号链接本身、仅处理真实文件,请添加-Attributes !ReparsePoint筛选条件:
2、Get-ChildItem -Path "C:\TargetFolder" -File -Recurse -Attributes !ReparsePoint | Get-FileHash -Algorithm SHA256 | Group-Object Hash | Where-Object Count -gt 1 | ForEach-Object { $_.Group | Select-Object FullName }









