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

CMD中使用延迟扩展与循环时如何打印含感叹号的文件名

解决批处理中含感叹号文件名丢失符号的问题

问题根源

启用延迟扩展时,CMD会将%%A这类FOR变量中的!识别为延迟扩展的边界符,直接解析为空,导致文件名里的!丢失。而循环内反复调用SETLOCAL/ENDLOCAL如果没正确闭合,会触发递归层级超限错误。

修正后的代码

SETLOCAL EnableDelayedExpansion

FOR /f "tokens=*" %%A IN ('dir /B "%covers_dump_full_path%" ^| findstr /V /I /C:".html"') DO (
    :: 临时关闭延迟扩展,确保%%A中的!被完整保留
    SETLOCAL DisableDelayedExpansion
    SET "game_name=%%A"
    FOR %%F IN ("%%A") DO SET "game_name_no_ext=%%~NF"
    
    :: 重新开启延迟扩展,处理需要动态判断的变量
    SETLOCAL EnableDelayedExpansion
    if !current_column! == 1 (
        ECHO         ^<tr^>>> "%game_html%"
    )

    :: 变量里的!已完整保留,可正常输出
    ECHO             ^<td align="center"^> ^<img src="!game_name!" width=300 height=250^> ^<br^> ^<b^> !game_name_no_ext! ^<br^> ^</b^> ^</td^>>> "%game_html%"

    if !current_column! == !max_columns! (
        ECHO         ^</tr^>>> "%game_html%"
        SET /a current_column=0
    )

    SET /a current_column=!current_column!+1
    
    :: 闭合两次SETLOCAL,避免层级累积
    ENDLOCAL
    ENDLOCAL
)
ENDLOCAL

关键说明

  • 循环内先关闭延迟扩展赋值,确保%%A中的!不被解析,完整存入变量。
  • 赋值完成后重新开启延迟扩展,处理需要动态计算的current_column变量。
  • 循环末尾必须用两次ENDLOCAL,对应前面的两次SETLOCAL,每次循环结束重置层级,避免触发递归超限错误。
  • 所有变量赋值采用SET "变量=值"语法,规避文件名中的空格或特殊字符引发的问题。

内容的提问来源于stack exchange,提问作者CodingNoob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 22:04:53