文件批量重命名用 bat 脚本能做到:先用 dir /b /o:n 把原文件名导出成清单留底,再写一段最简单的加前缀脚本,需要 001 到 100 连续编号就开延迟变量补零,顺序不对换成按修改时间排。
改名前把整个文件夹复制一份,只在副本上试跑,几百个文件按 F2 手改太慢的问题就能解决,也不怕改坏了回不去。以下方法在 Windows 10/11 实测可用。
适用系统:Windows 10/11;最后更新:2026-09-22。
几百个文件按 F2 手改太慢,bat 到底从哪下手
文件夹里几百张照片要统一加前缀,按 F2 一个个改一下午也改不完。第一次写 bat 常见的画面是:双击脚本后窗口一闪而过,文件名一个都没变,偶尔弹一行「命令语法不正确」或者「系统找不到指定的文件」。
卡住的地方通常就两处,循环变量写法和排序补零逻辑。先判断自己卡在哪一层,再对症改脚本,能省掉大量反复重来的时间。
方法1 先备份文件夹并导出原文件名清单
改名前先留底,脚本跑错了能照着清单一条条改回来。最稳的做法是把整个目标文件夹复制一份到 D:\rename_bak,所有试验都在副本上做,原始文件不动。
导出清单要在目标文件夹里打开命令提示符。在文件资源管理器地址栏直接敲 cmd 回车,窗口就落在当前目录,比一层层 cd 进去省事。
操作步骤
- 把整个目标文件夹复制一份到 D:\rename_bak,只在副本上试脚本
- 在目标文件夹地址栏直接输入 cmd 回车,命令提示符就落在当前目录
- 执行 dir /b /o:n > name_list.txt,把原文件名按顺序导出成清单
- 核对 name_list.txt 里的行数和文件夹里的文件数量是否一致
- 清单和备份都在位,再开始动改名脚本
方法2 写一段最短的加前缀 bat 脚本
十行以内就能跑通统一前缀,这是新手最容易成功的第一段批处理。脚本内容只写两行,第一行 @echo off,第二行 for %%f in (*.jpg) do ren "%%f" "IMG_%%f"。
循环变量在 bat 文件里要写两个百分号 %%f,在命令提示符窗口里直接敲才是单个 %f。这两个写反了,双击后变量不展开,文件一个都不会改。保存时编码选 ANSI,否则中文文件名容易变成乱码。
操作步骤
- 在目标文件夹里新建文本文件,重命名为 rename.bat,扩展名必须是 .bat 不能是 .txt
- 内容只写两行:@echo off 和 for %%f in (*.jpg) do ren "%%f" "IMG_%%f"
- 保存时编码选 ANSI,否则中文文件名容易乱码
- 双击运行前先把 ren 换成 echo 试跑一遍,只打印新名字不改名
- 确认打印结果符合预期,再改回 ren 双击执行
方法3 用延迟变量做 001 到 100 连续编号
要做 001、002、003 这种连续编号,必须开延迟变量。bat 默认在循环开始前就把变量一次性展开,不开延迟变量,每条循环拿到的都是同一个旧值,新名字会撞成一堆。
关键在于用感叹号取变量。写成 %num:~-3% 会全部展开成同一个号,改成 !num:~-3! 才会一个一个往下走。开头还要加 setlocal enabledelayedexpansion,再 set n=0 初始化计数器。
操作步骤
- 开头写 setlocal enabledelayedexpansion,再写 set n=0 初始化计数器
- 循环体里 set /a n+=1 自增,再用 set num=000!n! 把数字补成三位
- 取末三位拼新名:ren "%%f" "pic_!num:~-3!.jpg"
- 写成 %num:~-3% 会全部展开成同一个号,延迟展开必须用感叹号
- 先只 echo 新名字跑一遍,确认 001、002 连续再真正执行
用「软领Win解压缩」更省事
软领Win解压缩里的文件管理支持选中一批文件后直接生成新名字,可以按加前缀、替换文字、顺序编号几种方式组合。点执行前先看预览列表,跑完不满意还能对着 name_list.txt 改回来,全程不用打开记事本写脚本,也不用记 %%f 和 !num:~-3! 这类写法。
一批照片或者扫描件改完名,用创建压缩包一次打成压缩包,整批发走或者归档,不用在文件夹里一个个勾选。

改名后的图片体积偏大,上传前用图片压缩顺手压一遍,尺寸不变也能明显瘦身,整批发出去的速度快不少。

软领是知名国产软件品牌,20 年技术沉淀、服务千万用户。软领官网 wyouhua.com 直接下载,安装无捆绑勾选项。
软件里有客服按钮,点一下就能联系真人客服,情况复杂时还有工程师远程协助。

方法4 让编号按修改时间或拍摄时间排
for %%f in (*.jpg) 默认按文件名的字母序取文件,跟拍摄先后没关系。手机导出的照片名是 IMG_20240512_101533.jpg 这类,字母序和拍摄时间基本对得上;相机连拍导出的名字比较随意,顺序就乱了。
按修改时间排要把循环换成读 dir 的输出。dir /b /o:d *.jpg 从旧到新,把开关换成 /o:-d 就是从新到旧倒序编号。
操作步骤
- 默认 for %%f in (*.jpg) 走的是文件名字母序,跟拍摄先后没关系
- 按修改时间排要改成 for /f "delims=" %%f in ('dir /b /o:d *.jpg') do ...
- 把 /o:d 换成 /o:-d 就是从新到旧倒序编号
- 要连子文件夹一起处理,给 dir 加 /s,注意 /b /s 会带上完整路径
- 跑之前先用 echo 打印编号,核对顺序和预期一致
方法5 处理重名冲突和批量回滚
ren 碰到目标名已经存在,会直接跳过这个文件,不报错也不中断脚本,跑完才发现少改了几十个。这种情况看窗口是看不出来的,得自己查。
先确认有没有撞名,命令是 dir /b *.jpg | findstr /i "IMG_",列出来的就是已经带前缀的文件。脚本里加一句 if not exist "新名" 判断,能主动跳过被占用的目标名。
操作步骤
- 目标名已被占用时 ren 会直接跳过这个文件,不会中断脚本也不报错
- 先查有没有撞名:dir /b *.jpg | findstr /i "IMG_"
- 脚本里加 if not exist "新名" 判断,主动跳过被占用的目标名
- 改坏了就对着 name_list.txt 一条条改回原名
- 想整批重来,删掉改坏的副本,从 D:\rename_bak 重新复制一份
常见问题
文件批量重命名 bat 怎么写才能从 001 排到 100?
开头 setlocal enabledelayedexpansion,set n=0;循环里 set /a n+=1 自增,set num=000!n! 补三位,再用 ren "%%f" "pic_!num:~-3!.jpg" 取末三位。先 echo 一遍确认 001、002 连续再执行。
bat 里 for 循环写 %%f 还是 %f,为什么双击后没反应?
写进 .bat 文件用 %%f,在命令提示符窗口里直接敲用 %f。写成单个 %f 再双击,循环变量不会正常展开,文件一个都不改。
ren 命令提示文件已存在,批量改名失败怎么处理?
目标是同名的文件会被跳过,脚本不报错也不中断。先用 dir /b *.jpg | findstr /i "IMG_" 查一遍,再在脚本里加 if not exist 判断,跳过被占用的目标名。
批量重命名以后想改回原名,没导出清单还有办法吗?
没清单就只能凭印象手动改,照片还看 EXIF 里的拍摄时间对照。所以改名前一定先跑 dir /b /o:n > name_list.txt,把原名按顺序存下来。
bat 脚本处理中文文件名乱码,保存成什么编码?
在记事本里另存为时把编码选 ANSI,中文名就能正常显示。存成 UTF-8 又没加 chcp 65001,窗口里的中文会变成问号,文件名也跟着出错。
推荐阅读
mac压缩包Windows打开乱码,换解压工具或批量重命名也能解决
相关推荐

提示