当我尝试在.BAT文件IF语句中使用:clause 延迟扩展环境变量时,该行无法解析/执行。用%符号代替!用于扩建工程。相同的延迟扩展在其他地方有效,例如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 正确生成:相等
if!t:~0,2! == ab echo equal 发出错误: 2!此时出人意料
我不明白为什么我不能在IF语句中使用带有:的延迟扩展。如果没有冒号子句,IF语句中的延迟扩展可以正常工作。
答案 0 :(得分:2)
问题不在于延迟扩张本身,而是内部的逗号
这是因为批处理解析器会在扩展百分比之后扩展延迟扩展表达式
因此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?
了解不同批处理解析器阶段的顺序