使用For /R命令批量重命名PDF时,如何获取文件路径、文件名及文件夹名?
批处理脚本重命名子文件夹PDF文件问题解决
问题说明
- 使用
For /R %%I遍历子文件夹PDF时,无法正确获取文件路径、文件名及所在文件夹名 - 不使用
For /R时仅能处理当前文件夹,脚本运行正常 - 当前通过嵌套
For %%i设置文件夹名的方式错误,需正确获取文件属性的方法
期望实现:脚本位于C:\Users\Downloads时,自动将C:\Users\Downloads\AREA 1\xyyz.pdf重命名为C:\Users\Downloads\AREA 1\AREA 1_xyyz.pdf,可选实现重命名后移动文件。
现有代码
echo on setlocal enabledelayedexpansion set "folderpath=%~dp0" cd %folderpath% for /r %%I in ("*.pdf") do ( for %%i in (.) do ( (set fname=%%i) & for %%I in (.) do ( (set fldnm=%%~nxI) & call :rename ) ) ) @pause goto :eof :rename echo "%fldnm%_%fname%" ren "%fname%" "%fldnm%_%fname%" @pause goto :eof endlocal pause
问题分析与修正方案
现有代码的核心问题是嵌套for循环完全冗余,且错误用当前目录(.)获取文件属性,而非For /R遍历到的目标文件。For /R变量本身支持多种扩展参数,可直接获取文件各类属性:
%%~dpI:文件所在的完整目录路径(含末尾反斜杠)%%~nxI:文件的文件名+后缀%%~nI:文件名(不含后缀)%%~xI:文件后缀
要获取文件所在文件夹名,可通过%%~dpI结合额外for循环提取目录名称。
修正后脚本(仅重命名)
@echo off setlocal enabledelayedexpansion set "folderpath=%~dp0" cd /d "%folderpath%" :: 遍历当前及子文件夹下所有PDF文件 for /r %%I in ("*.pdf") do ( :: 获取文件所在的文件夹名 for %%J in ("%%~dpI.") do set "fldnm=%%~nxJ" :: 构造新文件名:文件夹名_原文件名 set "newfname=!fldnm!_%%~nxI" :: 执行重命名 echo 重命名:"%%I" → "%%~dpI!newfname!" ren "%%I" "!newfname!" ) endlocal pause
扩展:重命名后移动文件
如果需要将重命名后的文件统一移动到指定目录(如%folderpath%\processed),可添加移动逻辑:
@echo off setlocal enabledelayedexpansion set "folderpath=%~dp0" set "targetdir=%folderpath%\processed" :: 创建目标目录(不存在则新建) if not exist "%targetdir%" mkdir "%targetdir%" cd /d "%folderpath%" for /r %%I in ("*.pdf") do ( for %%J in ("%%~dpI.") do set "fldnm=%%~nxJ" set "newfname=!fldnm!_%%~nxI" echo 重命名:"%%I" → "%%~dpI!newfname!" ren "%%I" "!newfname!" :: 移动到目标目录 echo 移动:"%%~dpI!newfname!" → "%targetdir%" move "%%~dpI!newfname!" "%targetdir%" ) endlocal pause
关键说明
cd /d "%folderpath%":确保切换到脚本所在目录,避免路径异常- 延迟扩展(
enabledelayedexpansion):支持在for循环内部正确读取、修改变量值 %%~dpI.:通过.将目录路径转换为可提取名称的对象,%%~nxJ即可得到文件夹名
内容的提问来源于stack exchange,提问作者DeeWeez
相关产品推荐
相关产品推荐

