如何用Windows批处理按文件名片段创建文件夹并移动重命名文件
批量整理GML脚本文件:按对象名创建文件夹并重命名文件
我有一批文件名格式如下的文件:gml_Object_obj_A_Script_0.txtgml_Object_obj_B_Script_1.txt
其中obj_A、obj_B是对象名称,Script_0、Script_1是文件名称。需要编写Windows批处理文件,实现:
- 根据对象名称创建对应文件夹
- 将文件移动到对应文件夹,并完成重命名
示例执行后需达到的效果:
- 生成文件夹
obj_A,包含文件Script_0.txt - 生成文件夹
obj_B,包含文件Script_1.txt
我的错误尝试
我编写了以下批处理代码,但无法正常工作:
@echo off setlocal EnableExtensions DisableDelayedExpansion set "SourceDir=E:\TestBatch" set "DestDir=E:\TestBatch" for /F "eol=| delims=" %%A in ('dir /B /A-D-H "%SourceDir%\gml_Object_obj_*" 2^>nul') do ( for /F "eol=| tokens=2 delims=_" %%B in ("%%~nA") do ( md "%DestDir%\%%B" 2>nul set "FileName=%%A" call move /Y "%SourceDir%\%%A" "%DestDir%\%%B\%%FileName:~3%%" ) ) endlocal
执行后得到错误结果:
生成了一个名为Object的文件夹,里面包含两个文件:_Object_obj_A_Script_0.txt_Object_obj_B_Script_1.txt
修正后的解决方案
可用的批处理代码
@echo off setlocal EnableExtensions EnableDelayedExpansion set "SourceDir=E:\TestBatch" set "DestDir=E:\TestBatch" for /F "eol=| delims=" %%A in ('dir /B /A-D-H "%SourceDir%\gml_Object_obj_*" 2^>nul') do ( set "FileName=%%~nA" :: 提取对象名称(obj_A/obj_B) for /F "tokens=3 delims=_" %%B in ("!FileName!") do ( set "ObjName=obj_%%B" ) :: 提取脚本名称(Script_0/Script_1) for /F "tokens=4,5 delims=_" %%C in ("!FileName!") do ( set "ScriptName=%%C_%%D" ) :: 创建目标文件夹,已存在则忽略错误 md "%DestDir%\!ObjName!" 2>nul :: 移动文件并重命名 move /Y "%SourceDir%\%%A" "%DestDir%\!ObjName!\!ScriptName!.txt" ) endlocal
代码关键说明
- 启用延迟变量展开:添加
EnableDelayedExpansion,解决循环内部变量无法实时读取的问题,用!变量名!替代%变量名%读取循环内修改的变量 - 文件名拆分逻辑:
- 按下划线
_分割文件名,第3个token是对象标识(A/B),拼接成完整对象名obj_A/obj_B - 第4、5个token组合成脚本名称
Script_0/Script_1
- 按下划线
- 文件夹创建与文件移动:
md ... 2>nul:创建文件夹时屏蔽已存在的错误提示move /Y:强制覆盖目标文件夹内的同名文件(若存在)
内容的提问来源于stack exchange,提问作者Duy Hoang Nguyen
相关产品推荐
相关产品推荐

