You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批处理遍历目录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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:39:03