.bat脚本开启延迟扩展后含感叹号文件名变量存储打印异常
问题根源
你遇到的异常是开启ENABLEDELAYEDEXPANSION(延迟变量扩展)后的典型特征:延迟扩展模式下,系统会将!识别为变量的边界标记,自动尝试解析两个!中间的内容为变量名,文件名中单独/成对的!会被当作无效变量标记直接剔除,就出现了文件名缺失的问题。
解决方案1:直接使用for循环变量(最简方案,适用于不需要对文件名/路径做二次变量处理的场景)
你的代码中如果不需要额外对文件名、路径做二次加工,直接输出for循环的元变量即可,元变量的展开优先级早于延迟扩展的解析,不会受!影响:
@echo off pause setlocal ENABLEDELAYEDEXPANSION for /r %%f in (*.png *.jpg *.gif *.webp *.jpeg) do ( @echo %%~dpf%%~nxf @echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ) pause
解决方案2:循环内临时切换延迟扩展状态(适用于需要对文件名/路径做二次加工的场景)
如果确实需要把路径、文件名存入自定义变量做后续处理,可以在赋值时关闭延迟扩展,赋值完成后再开启使用:
@echo off pause setlocal DISABLEDELAYEDEXPANSION for /r %%f in (*.png *.jpg *.gif *.webp *.jpeg) do ( rem 关闭延迟扩展时赋值,避免文件名中的!被解析 set curr_name=%%~nxf set curr_path=%%~dpf rem 开启延迟扩展后再使用变量 setlocal ENABLEDELAYEDEXPANSION @echo !curr_path!!curr_name! @echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ endlocal ) pause
说明:内层的
setlocal/endlocal只会影响当前循环迭代的变量环境,不会污染全局状态,也不会影响下一次循环的赋值操作。
内容的提问来源于stack exchange,提问作者user10820441
相关产品推荐
相关产品推荐

