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
相关产品推荐
相关产品推荐

