如何用PowerShell递归重命名文件夹内文件并保留扩展名?
解决PowerShell批量重命名保留扩展名的问题
没问题,我帮你搞定这个重命名的问题!看你的需求,是要把文件夹里的视频文件改成「父文件夹名 + 季集号(合并Sxx.Exx为SxxExx) + 扩展名」的格式,同时避免破坏扩展名对吧?
原脚本的问题分析
你之前的脚本用了$_.name.Replace("."," "),这会把文件名里所有的点都替换成空格,包括扩展名里的那个点——系统识别不出没有点的扩展名,自然就会导致文件损坏了。
针对你需求的精准解决方案
我们可以拆分父文件夹名称、季集号和扩展名三部分来处理,确保只修改需要替换的部分:
cd 'C:\Users\ME\Desktop\HERE' Get-ChildItem -Recurse -File | ForEach-Object { # 获取当前文件所在的父文件夹名称(比如"文件夹A") $parentFolderName = $_.Directory.Name # 用正则匹配原文件名中的季集号(Sxx.Exx格式),并转换为SxxExx if ($_.BaseName -match 'S(\d+)\.E(\d+)') { $episodePart = "S$($matches[1])E$($matches[2])" # 拼接新文件名:父文件夹名 + 空格 + 季集号 + 原扩展名 $newFileName = "$parentFolderName $episodePart$($_.Extension)" # -WhatIf参数用于预览重命名效果,确认无误后可删除该参数执行实际操作 Rename-Item -Path $_.FullName -NewName $newFileName -PassThru -WhatIf } }
脚本说明:
Get-ChildItem -Recurse -File:递归遍历目标目录下的所有文件,比你原来的过滤方式更简洁高效。$_.Directory.Name:精准获取文件所在的父文件夹名称,作为新文件名的前缀。- 正则匹配
S(\d+)\.E(\d+):捕获原文件名中类似S01.E01的季集格式,自动把中间的点去掉,转换成S01E01。 $_.Extension:直接保留原文件的扩展名(比如.MP4),完全不会破坏文件格式。
备选方案:仅替换文件名中的点(保留扩展名)
如果你只是想把文件名里的所有点(除了扩展名的)换成空格(比如把Folder.A.S01.E01.MP4改成Folder A S01 E01.MP4),可以用这个更简单的脚本:
cd 'C:\Users\ME\Desktop\HERE' Get-ChildItem -Recurse -File | ForEach-Object { # 仅替换文件名主体部分的点为空格 $newBaseName = $_.BaseName.Replace(".", " ") # 拼接新文件名:处理后的主体 + 原扩展名 $newFileName = "$newBaseName$($_.Extension)" Rename-Item -Path $_.FullName -NewName $newFileName -PassThru -WhatIf }
注意事项
记得先保留-WhatIf参数运行脚本,预览所有重命名操作是否符合预期,确认没问题后再删除该参数执行实际重命名哦!
内容的提问来源于stack exchange,提问作者Defca Trick
相关产品推荐
相关产品推荐

