批处理脚本问题:如何提取字符串所有令牌生成驼峰式文件名
批处理脚本遍历下划线分隔令牌的解决方法
问题根源在于你使用的for /f "delims=_"默认只提取第一个下划线分隔的令牌,不会自动遍历所有部分。要实现驼峰式文件名转换,需要通过循环替换的方式逐个处理每个分隔后的单词。
修正后的完整脚本
@echo off setlocal enabledelayedexpansion for %%f in ("*.my_file_type") do ( set "BaseName=%%~nf" set "ExportName=" set "TempName=!BaseName!" :ProcessWords if not "!TempName!"=="" ( rem 提取当前第一个下划线分隔的单词 for /f "delims=_" %%a in ("!TempName!") do ( call :CapitalizeFirstLetter %%a set "ExportName=!ExportName!!CapWord!" ) rem 移除已处理的第一个单词及前置下划线 set "TempName=!TempName:*_=!" goto ProcessWords ) rem 预览转换结果(取消注释下一行可执行实际重命名) echo 原文件名: %%~nf.my_file_type → 目标文件名: !ExportName!.my_file_type rem ren "%%f" "!ExportName!.my_file_type" ) goto :eof :CapitalizeFirstLetter set "word=%~1" set "first=!word:~0,1!" set "rest=!word:~1!" rem 将首字符转为大写 for %%A in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do ( set "first=!first:%%a=%%A!" ) set "CapWord=!first!!rest!" goto :eof
关键逻辑说明
- 延迟扩展启用:
setlocal enabledelayedexpansion确保循环中变量的实时读取和修改生效。 - 循环处理令牌:
- 用
TempName存储待处理的剩余文件名片段 - 每次提取
TempName中第一个下划线前的单词,调用大写转换函数 - 用
!TempName:*_=!移除已处理的部分,循环直到TempName为空
- 用
- 首字母大写函数:通过遍历大小写字母映射,将单词首字符转为大写,保留后续字符不变。
效果验证
对于你的测试文件名:
my_file_name→MyFileNamefile_name→FileNamethis_is_another_file_name→ThisIsAnotherFileName
内容的提问来源于stack exchange,提问作者Arheus
相关产品推荐
相关产品推荐

