如何限制同文件夹内同名(不含扩展名)文件的重复检测并保留小文件
问题修正:PowerShell按目录+文件名分组保留小体积文件
需求
在同一目录下,匹配不含扩展名的文件基础名称,保留体积较小的文件。
目录结构示例
C:\FolderA\WhatzIt.mp3 3mb C:\FolderA\WhatzIt.opus 5mb C:\FolderA\Folder-1A\WhatzIt.wav 7mb C:\FolderA\Folder-1A\WhatzIt.mp3 4mb
当前错误分组结果
Duplicate group for 'WhatzIt': C:\FolderA\WhatzIt.opus C:\FolderA\Folder-1A\WhatzIt.wav
期望分组结果
Duplicate group for 'WhatzIt': C:\FolderA\WhatzIt.mp3 3mb C:\FolderA\WhatzIt.opus 5mb Duplicate group for 'WhatzIt': C:\FolderA\Folder-1A\WhatzIt.wav 7mb C:\FolderA\Folder-1A\WhatzIt.mp3 4mb
修正后的脚本
Remove-Variable * -ErrorAction SilentlyContinue $directoryPath = "C:\FolderA" # 获取目标文件,递归遍历但后续按目录分组 $files = Get-ChildItem -Path $directoryPath -File -Recurse -Force -Include *.wav, *.opus, *.mp3 # 关键修正:用完整目录路径+文件基名作为分组键,确保同一目录下的同名文件才会被分组 $groupedFiles = $files | Group-Object { # 组合完整目录路径和文件基名,作为唯一分组标识 Join-Path -Path $_.Directory.FullName -ChildPath $_.BaseName } foreach ($group in $groupedFiles) { if ($group.Count -gt 1) { # 输出分组信息,带文件大小 $baseName = $group.Group[0].BaseName Write-Host "`nDuplicate group for '$baseName' :" foreach ($file in $group.Group) { $fileSizeMB = [math]::Round($file.Length / 1MB, 2) Write-Host " - $($file.FullName) $fileSizeMB mb" } Write-Host "" # 按文件体积升序排序,保留最小的,删除其余 $filesToCheck = $group.Group | Sort-Object Length $filesToDelete = $filesToCheck[1..($filesToCheck.Count - 1)] foreach ($ToDel in $filesToDelete) { # 先保留-WhatIf确认删除目标,确认无误后可移除该参数 Remove-Item -Path $ToDel.FullName -Force -WhatIf $delSizeMB = [math]::Round($ToDel.Length / 1MB, 2) Write-Host "Deleted larger duplicate file: $($ToDel.FullName) ($delSizeMB mb)" } } } Read-Host -Prompt "Press Enter to exit"
关键修改说明
- 分组逻辑修正:原脚本的分组块未返回有效标识,现在通过
Join-Path组合文件的完整目录路径和基名作为分组键,确保只有同一目录下的同名文件才会被分到一组,不同子目录的同名文件会独立分组。 - 删除变量修正:原脚本删除时错误引用了外层循环的
$file变量,现在改为直接引用当前待删除的$ToDel变量,避免删除错误文件。 - 补充细节优化:新增文件体积的计算与显示,匹配示例格式;补充了
*.mp3文件类型以覆盖示例中的文件。
内容的提问来源于stack exchange,提问作者KatCat
相关产品推荐
相关产品推荐

