如何用PowerShell ISE递归遍历目录删除重复旧文件并保留最新版
PowerShell脚本:递归删除同名重复文件并保留最新版本
以下是可实现需求的脚本,附带详细说明和安全测试建议:
# 替换为你需要处理的目标目录路径 $targetDir = "C:\Your\Target\Folder" # 核心执行逻辑:递归取文件→按文件名分组→过滤重复组→保留最新删除其余 Get-ChildItem -Path $targetDir -File -Recurse | Group-Object -Property Name | Where-Object { $_.Count -gt 1 } | ForEach-Object { # 按修改时间倒序排序,第一个即为最新文件 $latestFile = $_.Group | Sort-Object LastWriteTime -Descending | Select-Object -First 1 # 筛选出组内除最新文件外的所有旧文件 $filesToDelete = $_.Group | Where-Object { $_.FullName -ne $latestFile.FullName } # 先输出待删除文件信息,确认无误后再执行删除 foreach ($file in $filesToDelete) { Write-Host "待删除旧文件: $($file.FullName) | 修改时间: $($file.LastWriteTime)" # 实际删除时去掉下面的注释,先保留-WhatIf参数做模拟测试 # Remove-Item -Path $file.FullName -Force -WhatIf } }
关键细节说明
- 递归遍历:
-Recurse参数确保覆盖所有子文件夹,-File仅处理文件,排除文件夹干扰 - 同名分组:
Group-Object Name将所有同名文件归为一组,便于批量处理重复项 - 过滤重复组:只处理文件数量大于1的组,避免对无重复的单文件做无效操作
- 判定最新文件:通过倒序排序修改时间,直接取第一个结果即为最新版本文件
- 安全机制:脚本默认仅输出待删除文件信息,
-WhatIf参数可模拟删除操作,确认无误后再去掉注释执行实际删除
自定义调整选项
- 若要按创建时间判断文件新旧,将
LastWriteTime替换为CreationTime - 若需忽略扩展名(例如
report.txt和report.pdf视为同名),将Group-Object -Property Name修改为:Group-Object -Property { [System.IO.Path]::GetFileNameWithoutExtension($_.Name) }
内容的提问来源于stack exchange,提问作者Peanuts
相关产品推荐
相关产品推荐

