使用.bat批处理递归遍历子文件夹按顺序批量重命名文件问题求助
批处理递归遍历子文件夹批量重命名脚本修复方案
故障原因
获取父目录名称为空的核心原因是:%%~dpa 语法取出的目录路径末尾默认携带反斜杠(例如d:\test\test1\),直接传入%%~ni取名称时,系统会将末尾反斜杠识别为路径分隔符,判定不存在名称字段,因此返回空值。
另外原脚本存在逻辑冗余问题:遍历所有文件的逻辑会导致同一个目录下的多个文件重复触发重命名流程,会出现计数重复、文件被多次重命名的异常。
修改点
- 拿到目录路径后先移除末尾反斜杠,再提取目录名称
- 调整遍历逻辑为遍历所有子目录,每个目录仅执行一次重命名操作
- 移除不必要的目录切换操作,避免路径切换异常
修复后完整脚本
@echo off setlocal enableextensions enabledelayedexpansion :: 调用powershell弹窗选择根目录 set "psCommand="(new-object -COM 'Shell.Application')^ .BrowseForFolder(0,'Please choose a folder.',0,0).self.path"" for /f "usebackq delims=" %%i in (`powershell %psCommand%`) do set "rootfolder=%%i" :: 遍历根目录下所有子目录(包含根目录本身) for /r "%rootfolder%\" /d %%d in (*) do ( :: 移除目录路径末尾的反斜杠 set "folder_path=%%d" :: 提取目录名作为parent变量 for %%n in ("!folder_path!") do set "parent=%%~nn" :: 初始化序号 set /a count=10000 :: 遍历当前目录下的tif文件,加2^>nul避免无tif文件时报错 for /F "eol=| delims=" %%f in ('dir /B /A:-D-H-S /O:N "!folder_path!\*.tif" 2^>nul') do ( set /a count+=1 set "fileName=!parent!_!count:~-4!%%~xf" rename "!folder_path!\%%f" "!fileName!" ) ) exit /b
内容的提问来源于stack exchange,提问作者Jeremy UK
相关产品推荐
相关产品推荐

