Windows批处理技术问询:从文本文件提取带扩展名的文件名
解决批处理提取文件路径中带扩展名文件名的问题
你的问题出在findstr的功能定位上——它只是用来匹配包含指定字符串的整行内容,根本不具备路径解析和字符串截取的能力,所以自然会把完整路径原封不动输出到name.txt里。要提取路径里的文件名,得用批处理专门为文件路径设计的语法,给你两种简单可行的方案:
方案1:利用For循环的内置变量修饰符(推荐)
这是批处理里最简洁高效的方式,For命令自带一套路径解析的变量修饰符,直接用%%~nxa就能精准获取文件的「名称+扩展名」:
@echo off :: 读取filename.txt里的每一行路径内容 for /f "delims=" %%a in (filename.txt) do ( :: %%~nxa 提取当前路径的文件名+扩展名,输出到name.txt echo %%~nxa > name.txt )
变量修饰符拆解:
%%~n:仅提取文件名(不含扩展名)%%~x:仅提取扩展名%%~nxa:合并文件名与扩展名,正好是你需要的结果
方案2:字符串替换截取
如果不想依赖For的内置变量,也可以用字符串替换的思路,把路径中最后一个\之前的所有内容全部清空:
@echo off :: 启用延迟变量扩展,确保循环内的变量替换能正常生效 setlocal enabledelayedexpansion for /f "delims=" %%a in (filename.txt) do ( set "fullpath=%%a" :: 把fullpath变量中第一个\及之前的所有内容替换为空,剩下的就是目标文件名 echo !fullpath:*\=! > name.txt ) endlocal
额外注意:
- 如果
filename.txt里有多行路径,上面的代码会用最后一行的文件名覆盖name.txt;要是需要保留所有行的文件名,把输出符号>改成>>(追加模式)即可。 - 把代码保存成
.bat文件,和filename.txt放在同一目录下运行就能得到结果。
内容的提问来源于stack exchange,提问作者Philip Zx
相关产品推荐
相关产品推荐

