批量去除文件名中重复单词的PowerShell脚本无法运行求助
批量去除文件名中重复单词的PowerShell脚本无法运行求助
嗨,我看到你尝试用这段PowerShell脚本来批量清理文件名里的重复单词,但它没达到预期效果对吧?咱们来一步步拆解问题,然后给出针对性的解决方案。
首先先把你用到的原脚本贴出来方便分析:
Get-ChildItem -Path .* -File -Recurse | ForEach-Object {
Rename-Item $_ -NewName ((($.Basename.Split("") | Select-Object -Unique) -Join "") + $($.Extension))
}
原脚本的问题点
这段脚本的核心逻辑是把文件名按下划线拆分、去重后再拼接,但它有几个明显的限制:
- 仅支持下划线分隔的单词:如果你的重复单词是用空格、连字符或者其他符号分隔的,脚本根本识别不到重复项
- 大小写敏感:比如
"Test"和"test"会被当成两个不同的单词保留,不会被去重 - 未处理重名场景:如果去重后的文件名和原文件名完全一致,
Rename-Item会抛出错误,中断执行流程
修正后的脚本(分场景)
我给你准备了几个不同场景的修正版本,你可以根据自己的文件名格式选择:
场景1:重复单词以下划线分隔(不区分大小写)
Get-ChildItem -Path .\* -File -Recurse | ForEach-Object { # 按下划线拆分文件名主体 $splitParts = $_.Basename.Split("_") # 不区分大小写分组去重,确保相同单词不管大小写都只保留一个 $uniqueParts = $splitParts | Group-Object -AsString -CaseInsensitive | Select-Object -ExpandProperty Name $newBasename = $uniqueParts -Join "_" $newName = $newBasename + $_.Extension # 只有当新文件名和原文件名不同时才执行重命名,避免无效操作和报错 if ($newName -ne $_.Name) { Rename-Item $_ -NewName $newName -ErrorAction SilentlyContinue Write-Host "已完成重命名: $($_.Name) -> $newName" } }
场景2:重复单词以空格分隔(不区分大小写)
如果你的文件名是用空格分隔单词的,只需要修改拆分逻辑即可:
Get-ChildItem -Path .\* -File -Recurse | ForEach-Object { # 按空格拆分,同时移除空项(避免连续空格导致的空元素) $splitParts = $_.Basename.Split(" ", [System.StringSplitOptions]::RemoveEmptyEntries) $uniqueParts = $splitParts | Group-Object -AsString -CaseInsensitive | Select-Object -ExpandProperty Name $newBasename = $uniqueParts -Join " " $newName = $newBasename + $_.Extension if ($newName -ne $_.Name) { Rename-Item $_ -NewName $newName -ErrorAction SilentlyContinue Write-Host "已完成重命名: $($_.Name) -> $newName" } }
场景3:混合分隔符(下划线+空格)
如果你的文件名同时用了下划线和空格分隔单词,可以用数组指定多个拆分符:
Get-ChildItem -Path .\* -File -Recurse | ForEach-Object { # 同时按下划线和空格拆分,移除空项 $splitParts = $_.Basename.Split("_ ", [System.StringSplitOptions]::RemoveEmptyEntries) $uniqueParts = $splitParts | Group-Object -AsString -CaseInsensitive | Select-Object -ExpandProperty Name # 这里可以选择用下划线或空格拼接,按需修改 $newBasename = $uniqueParts -Join " " $newName = $newBasename + $_.Extension if ($newName -ne $_.Name) { Rename-Item $_ -NewName $newName -ErrorAction SilentlyContinue Write-Host "已完成重命名: $($_.Name) -> $newName" } }
额外提示
-ErrorAction SilentlyContinue参数可以跳过因文件被占用、权限不足导致的重命名失败,避免整个脚本中断Write-Host输出可以让你实时看到重命名的过程,方便确认效果- 建议先在测试文件夹里试运行脚本,确认没问题后再批量处理目标文件
备注:内容来源于stack exchange,提问作者m26348762




