批处理脚本中如何从文件路径提取无后缀文件名?
批处理提取不含路径和后缀的文件名
推荐方法:用for变量内置修饰符
批处理的for变量自带修饰符,能直接提取文件名的指定部分,完全不用手动截取,避免硬编码路径长度的问题:
%%~nf:不含路径和后缀的纯文件名(正是你需要的)%%~f:完整路径(对应你代码里的%%f)%%~dpnf:驱动器+路径+不含后缀的文件名%%~xf:文件后缀(含.)
直接修改你的循环代码:
for /r "path/to/dir" %%f in (*.json) do ( # 直接输出或使用纯文件名 echo %%~nf # 如果要赋值给变量后续使用,结合延迟扩展 set "filename=%%~nf" )
修正你的原思路:启用延迟扩展手动截取
如果一定要用字符串截取,需修正语法并正确启用延迟扩展:
- 脚本开头开启延迟扩展:
setlocal enabledelayedexpansion - 先将完整路径赋值给变量,再对变量做截取操作(不能直接在
set里对%%f用截取语法)
修正后的代码:
@echo off setlocal enabledelayedexpansion for /r "path/to/dir" %%f in (*.json) do ( set "fullpath=%%f" set "nf=!fullpath:~0,68!" set "nf=!nf:~0,-5!" echo !nf! ) endlocal
你之前的问题根源:
- 错误写法
set nf=%%f:~0,68%%:批处理不支持直接对%%f变量做截取后赋值,必须先把%%f存入普通变量 - 延迟扩展未正确使用:循环内必须用
!变量!引用,而非%变量%,否则变量值会在脚本解析阶段被提前替换,导致输出异常
内容的提问来源于stack exchange,提问作者CatsCanCode
相关产品推荐
相关产品推荐

