You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 02:35:09