批量修改文件夹文件名:替换空格符号为短横线并转小写
批量重命名适配FTP的批处理解决方案
需求说明
每日需处理5000余个以.jpg格式为主的文件,重命名需满足以下规则:
- 将文件名转为全小写
- 把空格及所有指定符号(
!#.,;&*()@/等)替换为短横线- - 示例:
POS!99/6 09.JPG -> pos-99-6-09.jpg 75@0hu dfs*1010.jpg -> 75-0hudfs-1010.jpg
现有代码问题
你当前的代码仅实现了文件名转小写和移除下划线的功能,缺少对各类符号的替换处理,也未处理连续短横线的情况。现有代码如下:
@echo off setlocal for /f "Tokens=*" %%f in ('dir /l/b/a-d') do (rename "%%f" "%%f") for /f "tokens=1,2,* delims=_." %%F in ('dir /b "*_*.*"') do ren "%%F_%%G.%%H" "%%F.%%H" endlocal del *.bat
完整解决方案代码
以下是符合需求的批处理脚本,包含所有规则的实现:
@echo off setlocal enabledelayedexpansion :: 遍历当前目录下所有非目录文件 for /f "delims=" %%f in ('dir /b /a-d') do ( :: 跳过当前批处理文件本身,避免误操作 if "%%~nf%%~xf" neq "%~n0%~x0" ( :: 获取全小写的文件名(含扩展名) set "lower_name=%%~lg" :: 初始化新文件名 set "new_name=!lower_name!" :: 逐个替换目标符号为短横线 set "new_name=!new_name: =-!" set "new_name=!new_name:!=!" set "new_name=!new_name:#=-!" set "new_name=!new_name:.=-!" set "new_name=!new_name:,=-!" set "new_name=!new_name:;=-!" set "new_name=!new_name:&=-!" set "new_name=!new_name:*=-!" set "new_name=!new_name:(=-!" set "new_name=!new_name:)=-!" set "new_name=!new_name:@=-!" set "new_name=!new_name:/=-!" :: 清理连续的短横线(避免多个符号替换后出现--) :clean_dashes if "!new_name:--=-!" neq "!new_name!" ( set "new_name=!new_name:--=-!" goto clean_dashes ) :: 仅当新文件名与原文件不同时执行重命名 if "!new_name!" neq "%%~nf%%~xf" ( ren "%%f" "!new_name!" ) ) ) endlocal :: 若需执行完成后删除自身,可启用下面一行(替换原del *.bat,避免误删其他批处理) :: del "%~f0"
关键功能说明
- 延迟变量扩展:
setlocal enabledelayedexpansion允许在for循环内动态修改和读取变量值,是批处理处理字符串替换的必备设置。 - 小写转换:直接通过
%%~lg获取文件名的小写形式,比原代码的dir /l方式更简洁可靠。 - 符号替换:通过多次
set "new_name=!new_name:原字符=-!"语句,将所有目标符号替换为短横线;注意!符号在延迟扩展下需要用!!转义。 - 连续短横线清理:通过循环替换
--为-,避免多个符号相邻时生成连续短横线的问题。 - 安全处理:跳过脚本自身文件,且仅在新文件名不同时执行重命名,避免无效操作和误删。
内容的提问来源于stack exchange,提问作者Maksym Merenkov
相关产品推荐
相关产品推荐

