bat 文件 enabledelayedexpansion 不会在 IF 语句中扩展

bat file enabledelayedexpansion won't expand in IF statement

当我尝试在 .BAT 文件 IF 语句中使用 : 子句 延迟扩展环境变量 时,行失败 parse/execute。使用 % 符号代替 !用于扩建工程。相同的延迟扩展在其他地方也有效,例如 ECHO 语句。例如:

@echo off& setlocal enabledelayedexpansion
set t=abcd
echo !t:~0,2!
if %t:~0,2% == ab echo equal
if !t:~0,2! == ab echo equal

echo !t:~0,2! 正确生成:ab

if %t:~0,2% == ab echo equal 正确生成:equal

if !t:~0,2! == ab echo equal 发出错误:2!这时候出乎意料

我不明白为什么我不能在 IF 语句中使用带有 : 子句的延迟扩展 。如果没有冒号子句,IF 语句中的延迟扩展工作正常。

问题不是延迟展开本身,而是里面的逗号。
那是因为批解析器对延迟扩展表达式的扩展晚于百分比扩展。
因此 IF 解析器 看到 !t:~0,2! 并将逗号作为分隔符。

您可以使用引号简单地避免这种情况。
或者转义逗号。

if "!t:~0,2!" == "ab" echo equal
if !t:~0^,2! == ab echo equal

您可以在 SO:How does the Windows Command Interpreter (CMD.EXE) parse scripts?

了解不同批处理解析器阶段的顺序