当前位置:首页 > 娱乐

批处理 遍历文件夹及子文件夹 修改文件名

批处理 遍历文件夹及子文件夹 修改文件名

手头有三百多个PDF文件,批处散落在二十多个子文件夹里。理遍历文文件名全是夹及文件夹“报告_最终版_v3_真的最终版.pdf”这种鬼样子。一个个改?修改那是人干的事?我花了半小时写了个批处理脚本,三秒钟解决问题。文件

核心就一句话:for /r 循环遍历,批处ren 重命名。理遍历文但真写起来,夹及文件夹坑比想象的修改多。

先看最基础的文件遍历写法:

@echo off for /r "D:\我的文件" %%i in (*.pdf) do ( echo 找到文件:%%i ) 

这个/r参数就是递归的意思,后面跟路径,批处它会自动钻进每个子文件夹。理遍历文%%i是夹及文件夹当前文件的完整路径,包括文件名和后缀。修改跑一下,文件所有PDF路径全列出来了。

重命名得拆路径。文件名藏在路径最后面,需要把文件夹部分和文件名分开。用%%~ni取文件名(不带后缀),用%%~xi取后缀,用%%~dpi取文件夹路径。拆开再拼上,就成了新名字。

举个实际例子。我那些报告文件,想把“_最终版_v3_真的最终版”这段垃圾后缀全删掉,只留“报告_2024”这种干净格式。写法如下:

@echo off setlocal enabledelayedexpansion for /r "D:\我的文件" %%i in (*.pdf) do ( set "oldname=%%~ni" set "newname=!oldname:_最终版_v3_真的最终版=!" ren "%%i" "!newname!%%~xi" ) 

注意setlocal enabledelayedexpansion这行。批处理里,在循环内部修改变量值,必须开启延迟扩展,否则每次取到的都是初始值,白干。用!包裹变量名,就是延迟扩展的语法。这个坑我踩了不下五次。

如果只是想给所有文件加个前缀,比如加上年份:

for /r "D:\我的文件" %%i in (*.txt) do ( ren "%%i" "2024_%%~nxi" ) 

%%~nxi是文件名加后缀一起取,前面拼上“2024_”,搞定。简单粗暴。

但这里有个致命问题:如果文件已经被改过名,第二次运行脚本会重复加前缀,变成“2024_2024_文件.txt”。处理方式是先判断文件名是否已含特征:

for /r "D:\我的文件" %%i in (*.txt) do ( echo %%~ni | findstr /b "2024_" >nul || ren "%%i" "2024_%%~nxi" ) 

用findstr检查文件名开头是不是“2024_”,不是才执行改名。||的意思是前一条命令失败才执行后一条。这招能防止重复处理。

子文件夹名字也得考虑进去。有时候需要根据文件夹名来改文件。比如把文件移动到对应文件夹里,或者给文件名加上父文件夹的名字做区分:

for /r "D:\我的文件" %%i in (*.pdf) do ( set "parent=%%~dpi" for %%j in ("!parent:~0,-1!") do set "foldername=%%~nxj" ren "%%i" "!foldername!_%%~nxi" ) 

这段逻辑稍微绕点。%%~dpi拿到的是文件夹路径,末尾带反斜杠。用:~0,-1把最后一个字符去掉,再取最后一级文件夹名。然后拼到文件名前面。效果是“2024报告_报告_2024.pdf”这种,一看就知道文件归属哪个项目。

写批处理最烦的是中文路径和空格。路径里只要有空格,ren命令必须用引号把整个路径包起来。上面所有例子我都加了引号,养成习惯就好。中文编码也容易乱,保存脚本时用ANSI编码,别用UTF-8,否则中文路径直接报错。

最后提醒一句:跑脚本前先备份。别问我怎么知道的,上个月我一条命令把所有合同文件后缀从.docx改成了.doc,差点被开除。现在我的习惯是先在测试文件夹里跑一遍,确认输出没问题,再对真实数据动手。

批处理这玩意儿老,但真管用。Windows自带,不用装任何东西,写一次能反复用。遇到批量改文件名的活,三分钟写个脚本比手动点俩小时强太多。

分享到: