You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

批量去除文件名中重复单词的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

火山引擎 最新活动