批量重命名多目录文件并移除文件名中的日期
批量移除文件名末尾的日期(遍历所有子目录)
看起来你已经搞定了子目录遍历和目标文件定位的部分,但Windows批处理原生的ren命令确实没法灵活应对可变的日期格式——毕竟你要处理DDMMYYYY、MMDDYYYY、YYYYMMDD这类8位数字的日期段,而且它们都固定在文件名末尾。下面给你两种实用的解决方案:
方案一:PowerShell(推荐,支持灵活正则匹配)
PowerShell的正则处理能力可以轻松覆盖你提到的所有日期格式,而且测试起来更安全:
# 遍历目标目录下所有文件,递归子目录 Get-ChildItem -Path "C:\Users\Dummy\Desktop\UAT\Sample\" -Recurse -File | # 筛选文件名末尾带有 "-+8位数字" 的文件 Where-Object { $_.BaseName -match '-\d{8}$' } | # 执行重命名:移除末尾的 "-+8位数字" 部分 Rename-Item -NewName { $newBaseName = $_.BaseName -replace '-\d{8}$', '' "$newBaseName$($_.Extension)" } -WhatIf
说明:
-WhatIf参数是测试模式,运行时只会显示要重命名的结果,不会实际修改文件。确认输出符合预期后,删掉这个参数再执行即可。- 正则
-\d{8}$精准匹配文件名(不含扩展名)末尾的-加上8位数字,刚好覆盖你提到的三种日期格式。 - 不管是
.txt、.pdf还是.csv,只要文件符合命名规则,都会被正确处理。
方案二:纯Windows批处理(贴合你原有脚本)
如果你坚持用批处理,可以利用字符串截取来实现,前提是日期部分固定是-加8位数字:
@echo off setlocal enabledelayedexpansion :: 目标根目录 set "root=C:\Users\Dummy\Desktop\UAT\Sample\" :: 递归遍历所有符合 "*-8位数字.扩展名" 的文件 for /r "%root%" %%G in (*-????????.*) do ( :: 提取文件名(不含扩展名)和扩展名 set "filename=%%~nG" set "extension=%%~xG" :: 移除文件名最后9个字符("-" + 8位数字) set "newname=!filename:~0,-9!" :: 执行重命名 ren "%%G" "!newname!!extension!" ) endlocal echo 重命名完成,按任意键退出... pause >nul
说明:
enabledelayedexpansion必须开启,否则循环里的变量无法正确更新。*-????????.*用来匹配文件名末尾带有-和8位数字的文件,????????代表8个任意字符(这里刚好是数字)。!filename:~0,-9!是截取文件名的前长度-9个字符,因为-加8位数字一共占9个字符。
重要注意事项
- 先备份文件:不管用哪种方案,建议先复制一份测试目录,验证没问题后再处理原文件。
- 日期格式校验:确保所有要处理的日期都是
-开头的8位数字,如果有不带-的情况,需要调整正则或截取规则。 - 避免重复命名:如果重命名后出现同名文件,系统会报错,此时需要手动处理冲突。
内容的提问来源于stack exchange,提问作者Captain Catz
相关产品推荐
相关产品推荐

