如何修改批处理代码提取PDF文件名中的数字并写入TXT?
要实现只提取PDF文件名里的数字,你需要在原有批处理代码基础上添加数字提取逻辑——因为批处理没有原生正则支持,我们可以用两种实用的方式来搞定:
方案1:逐个字符筛选数字(推荐,兼容性强)
这个方法会逐个检查文件名的每个字符,只保留0-9的数字,不管文件名里有什么特殊符号都能准确提取:
@echo off setlocal enabledelayedexpansion :: 定义目标桌面路径和输出TXT路径 set "desktopPath=C:\Users\asd123\Desktop\" set "outputTxt=%desktopPath%file_names.txt" :: 先清空输出文件(避免重复追加旧内容) echo. > "%outputTxt%" :: 遍历桌面所有PDF文件 for %%a in ("%desktopPath%*.pdf") do ( set "fileName=%%~na" :: 获取不含后缀的文件名(比如"qwerty - 123") set "extractedDigits=" :: 初始化存储数字的变量 :: 逐个读取文件名的每个字符 for /l %%i in (0,1,99) do ( :: 如果取到空字符,说明遍历完文件名了,跳出循环 if "!fileName:~%%i,1!"=="" goto :endCharCheck set "currentChar=!fileName:~%%i,1!" :: 检查当前字符是否为数字 echo !currentChar! | findstr /r "^[0-9]$" >nul if not errorlevel 1 ( :: 是数字就追加到结果变量里 set "extractedDigits=!extractedDigits!!currentChar!" ) ) :endCharCheck :: 只有提取到数字时才写入文件,避免空行 if defined extractedDigits echo !extractedDigits! >> "%outputTxt%" ) endlocal pause
关键细节说明:
setlocal enabledelayedexpansion:必须开启延迟扩展,才能在循环里实时更新变量值%%~na:批处理内置语法,用来获取文件的「不含后缀的文件名」findstr /r "^[0-9]$":用正则匹配单个数字,判断字符是否符合要求
方案2:批量替换非数字字符(简洁版,适合已知非数字类型的场景)
如果你的PDF文件名里只有空格、字母、-、_这类固定的非数字字符,可以用批量替换的方式快速清理掉非数字内容:
@echo off setlocal enabledelayedexpansion set "desktopPath=C:\Users\asd123\Desktop\" set "outputTxt=%desktopPath%file_names.txt" echo. > "%outputTxt%" for %%a in ("%desktopPath%*.pdf") do ( set "fileName=%%~na" set "onlyDigits=!fileName!" :: 替换所有空格为空 set "onlyDigits=!onlyDigits: =!" :: 替换所有大小写字母为空 for %%l in (a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do ( set "onlyDigits=!onlyDigits:%%l=!" ) :: 替换常见符号(可根据你的实际文件名补充其他符号) for %%s in (- _) do ( set "onlyDigits=!onlyDigits:%%s=!" ) if not "!onlyDigits!"=="" echo !onlyDigits! >> "%outputTxt%" ) endlocal pause
注意事项:
如果文件名里有其他特殊符号(比如@、#、$),需要在符号替换的循环里补充对应的符号,否则这些符号会被保留下来。
把上面任意一段代码保存成.bat文件运行,就能得到只包含PDF文件名中数字的TXT文件了。
内容的提问来源于stack exchange,提问作者BlueArt




