批处理文件中带颜色的echo语句仅在if语句外生效问题求解
问题原因
- 批处理中
()包裹的代码块(包括if判断体、for循环体)会被cmd一次性预解析,如果你是用变量存储ANSI转义序列的开头ESC字符(ASCII 0x1B),默认的即时变量展开会在代码块执行前就完成解析,容易导致ESC字符丢失或转义序列被破坏。 - 部分旧版本Windows系统默认没有开启虚拟终端处理,代码块内的输出会额外触发终端模式重置,导致ANSI序列失效。
解决方法
方法1:开启延迟变量扩展(最通用)
在脚本开头加上setlocal enabledelayedexpansion,存储ESC字符的变量改用!ESC!延迟展开的方式调用,示例代码如下:
@echo off setlocal enabledelayedexpansion :: 此处的^[是按Ctrl+[输入的实际ASCII 0x1B字符,不是手动输入的^和[两个字符 set ESC=^[ for %%n in (%listPath%) do ( echo Starting Build echo. devenv %%n /build Debug if ERRORLEVEL 1 ( echo !ESC
