批处理遍历目录PDF按下划线分割取文件名子串语法错误如何解决
问题原因
你遇到的问题核心是未开启批处理的延迟变量扩展:
批处理默认会在执行for、if这类代码块前,预先替换块内所有%包裹的变量为执行前的静态值,你用!var!的变量延迟写法必须先开启对应开关才能正常解析。
未开开关时的两个报错对应原因:
- 给
for /f传带双引号的!var!,解析器识别不了这个变量,直接把!var!当普通字符串处理,所以输出的%%i就是!var! - 去掉双引号后,
for /f默认会把后面的内容当做要读取的文件名处理,系统会真的去查找名为!var!的文件,就会抛出找不到文件的报错。
修正方案
方案1:开启延迟扩展,适配原有写法
直接在@ECHO OFF下加一行开启延迟扩展的声明即可:
@ECHO OFF @setlocal enabledelayedexpansion for /r %%a in (*.pdf) do ( echo 原文件名:%%~nxa set var=%%~nxa for /F "tokens=1 delims=_" %%i in ("!var!") do ( echo 下划线前的部分:%%i ) ) PAUSE
如果要同时取下划线前后的内容,保留tokens=1-2即可,%%i是前半段,%%j是后半段。
方案2:省略临时变量,无需延迟扩展
其实不需要额外定义var临时变量,直接把for循环拿到的文件名参数传给for /f即可,不用开延迟扩展更简单:
@ECHO OFF for /r %%a in (*.pdf) do ( echo 原文件名:%%~nxa for /F "tokens=1 delims=_" %%i in ("%%~nxa") do ( echo 下划线前的部分:%%i ) ) PAUSE
内容的提问来源于stack exchange,提问作者testItAll
相关产品推荐
相关产品推荐

