命令是干什么的
用 for 循环配合 ren 给一批文件统一加工:加前缀、换后缀、按序号编号。核心是 for %变量 in (文件集) do 的写法,它在命令行交互与批处理文件里语法不同——交互式用单百分号 %f,批处理 .bat 里必须写双百分号 %%f。
延迟展开为什么必须
循环体内若要一边修改变量、一边使用它的新值(例如自增计数器 i 并立即用于命名),普通 %i% 在解析期就被替换成旧值。必须 setlocal enabledelayedexpansion 并改用 !i!,这是批量编号脚本最容易出错的地方。
基本信息
| 适用平台 | Windows 全版本 CMD(Windows 7/10/11 与各版 Server) |
|---|---|
| 语法 | for %变量 in (文件集) do ren 旧名 新名,批处理文件里写 %%变量 |
| 关键差异 | 命令行交互用 %f;批处理文件用 %%f |
| 延迟展开 | setlocal enabledelayedexpansion 之后用 !变量! 取实时值 |
典型使用场景
- 给某目录下所有照片统一加前缀,例如 vacation_
- 批量修改扩展名,例如把 .txt 改成 .md
- 给文件按顺序编号,生成 img_1.jpg、img_2.jpg 这样的名字
- 打包或归档前统一加上日期前缀
- 清理导出文件名里重复出现的固定前缀
命令行与批处理写法
命令行与批处理写法
:: 命令行交互式:给所有 jpg 加前缀
for %f in (*.jpg) do ren "%f" "vacation_%f"
:: 批处理文件中:必须用双百分号
for %%f in (*.jpg) do ren "%%f" "vacation_%%f"
:: 按序号编号(需延迟变量展开,否则序号不递增)
setlocal enabledelayedexpansion
set /a i=0
for %%f in (*.jpg) do (set /a i+=1 & ren "%%f" "img_!i!.jpg")写法读法
| 写法 | 生效位置 | 说明 |
|---|---|---|
| %f | 命令行交互窗口 | 在窗口中直接执行时使用 |
| %%f | 批处理文件 | 写成 %f 会静默失效 |
| (*.jpg) | 文件集 | 可用通配符,也可写多个模式 |
| !i! | 延迟展开取值 | 必须先 enabledelayedexpansion |
| %i% | 解析期替换 | 循环内取不到刚更新的值 |
| ren 目标名 | 改名动作 | 目标名已存在会报错中断 |
命令行里写 %f 可用,批处理里必须写 %%f;反之在命令行写 %%f 不报错但匹配不到文件,这类静默失败最耗排查时间。
只是统一改扩展名可以直接用 ren *.txt *.md;命名规则更复杂时,用 PowerShell 的 Rename-Item 配计算出的新名更直观。执行前先复制一份目录演练,能避免不可逆的批量改名事故。