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?
了解不同批处理解析器阶段的顺序
当我尝试在 .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?
了解不同批处理解析器阶段的顺序