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

PowerShell无法重命名文件及识别扩展名问题求助

PowerShell 文件批量重命名问题修正

需求说明

现有文件:

The Fast and the Furious Tokyo Drift   .avi
The Fast and the Furious 1080p  .mkv

需要重命名为:

The Fast and the Furious Tokyo Drift.avi
The Fast and the Furious.mkv

原脚本问题分析

原脚本存在以下关键问题,导致无法达到预期效果:

  • 直接对包含扩展名的$file.Name做替换后,又重复拼接$file.Extension,会造成扩展名重复
  • 仅单次替换双空格,无法彻底清理多个连续空格
  • 文件名与扩展名之间的空格处理逻辑错误,应该单独处理文件主名部分再拼接扩展名
  • 同名文件的序号追加逻辑错误,未基于处理后的新名称生成,而是沿用了原文件主名

修正后的脚本

# 指定待重命名文件所在目录
$directory = 'C:\temp\film\test2'

# 获取目录中指定扩展名的文件列表(仅文件,排除目录)
$files = Get-ChildItem $directory -Include '*.avi', '*.mkv', '*.mp4' -File

# 初始化同名文件计数器
$counter = 1

# 遍历每个文件
foreach ($file in $files) {
    # 定义需要移除的关键词(不区分大小写)
    $searchPattern = '(?i)\b(ITA|ENG|AC3|BDRip|1080p|X265_ZMachine)\b'
    
    # 仅对文件主名(不含扩展名)进行关键词替换
    $newBaseName = $file.BaseName -replace $searchPattern, ''
    
    # 清理所有连续空格(将多个连续空格替换为单个)
    $newBaseName = $newBaseName -replace '\s+', ' '
    
    # 移除主名首尾的空格
    $newBaseName = $newBaseName.Trim()
    
    # 拼接最终新文件名(主名+扩展名)
    $newName = "$newBaseName$($file.Extension)"
    
    # 检查新文件名是否已存在,若存在则追加序号
    while (Test-Path -Path (Join-Path $directory $newName)) {
        $newName = "$newBaseName_$counter$($file.Extension)"
        $counter++
    }
    
    # 执行重命名,-Force参数处理特殊权限/只读文件场景
    Rename-Item -Path $file.FullName -NewName $newName -Force
    
    # 重置计数器,用于下一个文件的同名检查
    $counter = 1
}

关键修正点

  • 仅针对$file.BaseName(不含扩展名的文件主名)处理,避免重复拼接扩展名
  • 使用\s+正则表达式一次性清理所有连续空格,彻底解决多空格问题
  • 先清理主名首尾空格再直接拼接扩展名,确保主名与扩展名之间无多余空格
  • 同名文件检查时,基于处理后的新主名追加序号,符合预期命名逻辑
  • 添加-File参数确保仅获取文件对象,排除目录干扰
  • 添加-Force参数兼容特殊权限或只读文件的重命名操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:25:33