1. 为什么需要批量重命名文件在日常工作中我们经常会遇到需要批量处理文件的情况。比如摄影师整理照片时可能需要将数百张照片按照日期地点的格式重命名程序员整理代码文件时可能需要统一修改文件前缀或者普通用户想要整理下载文件夹中杂乱无章的文件名。手动一个个重命名不仅效率低下还容易出错。Windows自带的批量重命名功能选中文件后按F2虽然简单但功能非常有限只能添加序号后缀。这时候批处理脚本.bat文件就派上用场了。我最近就遇到一个实际案例客户发来了300多个产品图片文件名都是类似IMG_20230501_123456.jpg这样的格式需要统一改成产品A_001.jpg、产品B_002.jpg这样的规范命名。手动改那得改到猴年马月。用批处理脚本不到一分钟就搞定了。2. 批处理脚本基础入门2.1 创建你的第一个批处理脚本让我们从一个最简单的例子开始。假设你有一堆.txt文件想把它们都加上笔记_前缀新建一个文本文件把后缀改成.bat比如重命名.bat右键编辑这个文件输入以下代码echo off for %%f in (*.txt) do ren %%f 笔记_%%f把这个.bat文件放到你的txt文件所在文件夹双击运行解释一下这段代码echo off关闭命令回显让界面更简洁for %%f in (*.txt)遍历当前目录下所有.txt文件do ren %%f 笔记_%%f对每个文件执行重命名操作2.2 基本重命名操作批处理中最常用的重命名命令是ren或rename基本语法是ren 原文件名 新文件名几个实用技巧保留原文件名部分内容ren 报告_v1.txt 报告_v2.txt修改文件扩展名ren *.txt *.bak删除文件名中的特定字符ren 文件 - 副本.txt 文件.txt3. 进阶技巧使用变量和延迟扩展3.1 变量和延迟扩展基础当我们需要在循环中使用计数器或者在文件名中添加序号时就需要用到变量和延迟扩展。看这个例子echo off setlocal enabledelayedexpansion set count1 for %%f in (*.jpg) do ( ren %%f 图片!count!.jpg set /a count1 )这段代码会把所有.jpg文件重命名为图片1.jpg、图片2.jpg这样依次递增的名字。关键点setlocal enabledelayedexpansion启用延迟变量扩展!count!使用延迟扩展语法获取变量最新值set /a count1让计数器自增13.2 实际应用案例假设你有一批学生作业文件命名格式是学号_姓名_作业.docx现在需要统一改成姓名_学号.docxecho off setlocal enabledelayedexpansion for %%f in (*_*_*.docx) do ( set filename%%~nf for /f tokens1,2 delims_ %%a in (!filename!) do ( ren %%f %%b_%%a.docx ) )这个脚本用到了文件名分割delims_指定下划线为分隔符多级for循环变量替换4. 正则表达式在批处理中的应用4.1 基本正则匹配虽然Windows批处理本身不支持完整的正则表达式但我们可以通过一些技巧实现类似功能。比如使用findstr命令echo off for /f delims %%f in (dir /b ^| findstr /r ^[0-9].*\.txt$) do ( echo 匹配到文件: %%f )这个脚本会找出所有以数字开头、.txt结尾的文件。4.2 复杂替换案例假设你要把文件名中的日期格式从YYYYMMDD改为YYYY-MM-DDecho off setlocal enabledelayedexpansion for %%f in (*.txt) do ( set name%%~nf set newname!name:~0,4!-!name:~4,2!-!name:~6,2! ren %%f !newname!.txt )这里用到了子字符串提取!name:~0,4!从第0个字符开始取4位年!name:~4,2!从第4个字符开始取2位月!name:~6,2!从第6个字符开始取2位日5. 实战综合应用案例5.1 照片整理脚本这是一个我实际用过的照片整理脚本功能包括从EXIF信息中提取拍摄日期按YYYYMMDD_HHMMSS格式重命名跳过已经正确命名的文件echo off setlocal enabledelayedexpansion for %%f in (*.jpg) do ( set filename%%~nf echo !filename! | findstr /r ^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9][0-9][0-9]$ nul if errorlevel 1 ( for /f tokens1-6 delims: %%a in (exiftool -DateTimeOriginal -d %%Y %%m %%d %%H %%M %%S %%f) do ( ren %%f %%a%%b%%c_%%d%%e%%f.jpg ) ) )注意这个脚本需要先安装exiftool工具。5.2 日志文件归档脚本另一个实用案例是日志文件归档。假设你的应用每天生成日志文件命名格式是log_2023-05-01.txt现在需要提取日期部分创建以月份命名的文件夹如2023-05把对应日期的日志文件移动到相应文件夹echo off setlocal enabledelayedexpansion for %%f in (log_*.txt) do ( set filename%%~nf set datepart!filename:~4,10! for /f tokens1,2 delims- %%a in (!datepart!) do ( set folder%%a-%%b if not exist !folder! mkdir !folder! move %%f !folder!\%%~nxf ) )6. 常见问题与调试技巧6.1 文件名包含特殊字符怎么办当文件名包含空格或特殊字符时一定要用引号括起来ren 包含空格 的文件.txt 新文件名.txt6.2 如何调试批处理脚本去掉echo off可以看到每条命令的执行情况在关键位置添加pause命令暂停执行使用echo输出中间变量值先在不执行重命名的模式下测试for %%f in (*.txt) do echo ren %%f 新_%%f6.3 如何撤销批量重命名批处理没有内置的撤销功能所以操作前一定要备份原始文件先在小范围测试使用echo预览将要执行的操作7. 更高效的工具推荐虽然批处理脚本很强大但对于特别复杂的重命名需求可以考虑以下工具Advanced Renamer图形界面支持多种重命名规则Bulk Rename Utility功能非常全面PowerShell比批处理更强大的脚本能力不过掌握批处理脚本仍然是值得的因为它无需安装额外软件可以集成到自动化流程中执行速度极快8. 最佳实践与安全提示总是先备份文件在测试文件夹中先运行脚本使用echo命令预览重命名效果文件名避免使用特殊字符考虑文件名长度限制Windows最大260字符记住批处理脚本执行重命名是不可逆的操作。我曾经有一次不小心把客户的所有照片都重命名错了幸好有备份。所以现在我的工作流程是创建备份文件夹复制要处理的文件到工作目录在工作目录执行重命名检查无误后再处理原始文件