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

请求修改脚本:实现文件夹按大小比对并移动重复项

嘿,我完全懂你现在的需求——把原本找重复文件并移动的逻辑,改成处理文件夹对吧?之前你试了加-Directory参数但卡壳了,其实核心是文件夹的“重复判断”和文件不一样,得用总内容大小来识别,而不是文件夹本身的元数据大小。我给你整理了完整的PowerShell脚本,还有关键步骤的解释,你可以直接用:

核心逻辑梳理
  • 第一步得算出每个文件夹的实际总内容大小:系统显示的文件夹大小只是元数据,真正的内容大小是里面所有子文件、子文件夹的大小总和,必须递归计算
  • 按总大小给文件夹分组,挑出那些总大小重复的组
  • 每个重复组里留一个在原路径(你可以自定义保留规则),剩下的全部移到C:\files_compared目录
完整PowerShell脚本
# 定义原路径和目标路径
$sourcePath = "C:\folder1"
$targetPath = "C:\files_compared"

# 先创建目标目录(如果还不存在的话)
if (-not (Test-Path -Path $targetPath)) {
    New-Item -Path $targetPath -ItemType Directory | Out-Null
}

# 递归获取所有子文件夹,同时计算每个文件夹的总内容大小
$foldersWithSize = Get-ChildItem -Path $sourcePath -Directory -Recurse | ForEach-Object {
    # 递归统计当前文件夹下所有文件的大小总和
    $totalSize = (Get-ChildItem -Path $_.FullName -File -Recurse | Measure-Object -Property Length -Sum).Sum
    # 把文件夹信息和总大小存成自定义对象
    [PSCustomObject]@{
        FullName = $_.FullName
        TotalSize = $totalSize
        CreationTime = $_.CreationTime  # 用来自定义保留规则的可选字段
    }
}

# 按总大小分组,只保留有多个文件夹的组(也就是重复大小的组)
$duplicateGroups = $foldersWithSize | Group-Object -Property TotalSize | Where-Object { $_.Count -gt 1 }

# 处理每个重复组:留一个,移其余
foreach ($group in $duplicateGroups) {
    # 默认保留组里的第一个文件夹,你可以改这里的规则
    $keepFolder = $group.Group | Select-Object -First 1
    Write-Host "保留原路径文件夹: $($keepFolder.FullName) (总大小: $($keepFolder.TotalSize) 字节)"

    # 遍历组里剩下的文件夹,移动到目标路径
    $group.Group | Where-Object { $_.FullName -ne $keepFolder.FullName } | ForEach-Object {
        $targetFolderPath = Join-Path -Path $targetPath -ChildPath $_.Name
        # 如果目标目录已经有同名文件夹,自动加数字后缀避免冲突
        $suffix = 1
        while (Test-Path -Path $targetFolderPath) {
            $targetFolderPath = Join-Path -Path $targetPath -ChildPath "$($_.Name)_$suffix"
            $suffix++
        }
        try {
            Move-Item -Path $_.FullName -Destination $targetFolderPath -Force
            Write-Host "已成功移动: $($_.FullName) -> $targetFolderPath"
        } catch {
            Write-Error "移动失败: $($_.FullName) - 错误信息: $($_.Exception.Message)"
        }
    }
}

Write-Host "重复文件夹处理完成!"
关键细节说明
  1. 总大小计算:用Get-ChildItem -File -Recurse拿到文件夹里所有文件,再用Measure-Object -Sum Length算出总和,这才是文件夹的真实内容大小
  2. 重复分组:通过Group-Object TotalSize把相同大小的文件夹归为一组,再筛选出成员数大于1的组,这些就是有重复的文件夹
  3. 避免移动冲突:如果目标目录已经有同名文件夹,脚本会自动加数字后缀(比如TestFolder→TestFolder_1),不会覆盖也不会报错
  4. 自定义保留规则:要是你不想默认保留第一个,可以改成按创建时间排序,比如:
    # 保留创建时间最早的文件夹
    $keepFolder = $group.Group | Sort-Object CreationTime | Select-Object -First 1
    # 或者保留创建时间最晚的
    $keepFolder = $group.Group | Sort-Object CreationTime -Descending | Select-Object -First 1
    
温馨提示
  • 测试阶段可以把Move-Item改成Write-Host "将要移动: $($_.FullName) -> $targetFolderPath",先确认逻辑没问题再实际移动
  • 确保你有原路径和目标路径的读写权限,不然会移动失败
  • 超大文件夹计算总大小可能需要点时间,别着急,等脚本跑完就行

内容的提问来源于stack exchange,提问作者John Adam1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:51:27