You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批处理脚本问题:如何提取字符串所有令牌生成驼峰式文件名

批处理脚本遍历下划线分隔令牌的解决方法

问题根源在于你使用的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

关键逻辑说明

  1. 延迟扩展启用:setlocal enabledelayedexpansion确保循环中变量的实时读取和修改生效。
  2. 循环处理令牌:
    • 用TempName存储待处理的剩余文件名片段
    • 每次提取TempName中第一个下划线前的单词,调用大写转换函数
    • 用!TempName:*_=!移除已处理的部分,循环直到TempName为空
  3. 首字母大写函数:通过遍历大小写字母映射,将单词首字符转为大写,保留后续字符不变。

效果验证

对于你的测试文件名:

  • my_file_name → MyFileName
  • file_name → FileName
  • this_is_another_file_name → ThisIsAnotherFileName

内容的提问来源于stack exchange,提问作者Arheus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 08:28:37