如何修改批处理脚本实现子目录文件按父目录前缀递归重命名?
批处理脚本修改方案:提取父目录前缀重命名文件
你的脚本问题出在%%~nxx的使用上——它会直接取子目录的完整名称(比如test1.noxz),导致重命名后文件名变成test1.noxz.xz,不符合提取.之前前缀的需求。
修改后的脚本如下:
@echo off for /r /d %%x in (*) do ( for %%y in (xz) do ( for %%f in ("%%x\*.%%y") do ( :: 以点为分隔符,提取子目录名的第一部分 for /f "delims=. tokens=1" %%p in ("%%~nx") do ( ren "%%f" "%%p.%%y" ) ) ) )
关键修改说明:
- 新增
for /f "delims=. tokens=1" %%p in ("%%~nx"):通过delims=.设置分隔符为点,tokens=1只取第一部分内容,从子目录名(如test1.noxz)中提取出test1 - 重命名命令改为
ren "%%f" "%%p.%%y":用提取到的前缀%%p替换原文件名,保留原后缀%%y
如果你的子目录名格式固定为xxx.noxz(仅含一个点),也可以用更简洁的变量替换写法替代内层的for /f:
@echo off for /r /d %%x in (*) do ( set "dirName=%%~nx" setlocal enabledelayedexpansion set "prefix=!dirName:.noxz=!" for %%y in (xz) do ( ren "%%x\*.%%y" "!prefix!.%%y" 2>NUL ) endlocal )
注意这种写法需要启用延迟变量扩展(enabledelayedexpansion),因为在循环中动态修改变量需要延迟扩展支持。
内容的提问来源于stack exchange,提问作者Szopri Szabolcs
相关产品推荐
相关产品推荐

