如何在PowerShell的Get-ChildItem中排除多文件夹以查找并删除重复文件
修复PowerShell重复文件删除脚本(排除指定子目录)
原脚本的核心问题是排除目录的逻辑错误:-NotLike无法直接处理数组形式的排除路径,且通配符使用方式不对,导致排除规则不生效,甚至可能筛选出错误文件。
修正后的脚本
$srcDir = "rootDir" $excludeDirs = @( "rootDir/subDir1", "rootDir/subDir1/childsubDir1", "rootDir/subDir2", "rootDir/subDir3" ) # 获取所有文件并过滤排除目录下的内容 Get-ChildItem -Path $srcDir -File -Recurse | Where-Object { $filePath = $_.FullName # 检查当前文件是否不属于任何排除目录的子路径 -not ($excludeDirs | Where-Object { $filePath -like "$_\*" }) } | # 按文件大小分组,先过滤唯一大小的文件(减少后续计算量) Group-Object -Property Length | Where-Object { $_.Count -gt 1 } | Select-Object -ExpandProperty Group | # 按扩展名分组(可选,可根据需求移除) Group-Object -Property Extension | Where-Object { $_.Count -gt 1 } | Select-Object -ExpandProperty Group | # 计算文件哈希值 Get-FileHash -Algorithm MD5 | # 按哈希分组找出重复文件 Group-Object -Property Hash | Where-Object { $_.Count -gt 1 } | ForEach-Object { $_.Group | Select-Object Path, Hash } | # 可视化选择要删除的文件 Out-GridView -Title "选择要删除的重复文件" -PassThru | Remove-Item -Force -Verbose
关键修复点
- 排除逻辑修正:使用
Where-Object结合-like "$_\*",逐个验证文件是否属于排除目录的子路径,确保指定子目录及其所有子文件都被过滤。 - 数组语法规范:用
@()明确声明排除目录数组,避免语法歧义。 - 可读性优化:拆分长管道为多行并添加注释,清晰展示每个步骤的作用。
额外提示
- 优先使用绝对路径作为
$srcDir和排除目录的路径,避免因当前工作目录变化导致的路径错误。 - 若不需要按扩展名筛选,可移除
Group-Object -Property Extension相关的两行,提升脚本运行效率。
内容的提问来源于stack exchange,提问作者jamyandy_1500
相关产品推荐
相关产品推荐

