,;=<tab>
并且<space>
是 cmd.exe 的分隔符,并且在许多情况下,如果它们不在引号中并且像空格一样被忽略。可能在这种情况下,
被视为第一个操作数的结尾,并且IF
惊讶于没有有效的比较运算符,例如 this将打印yep
:
if a ;==;,,=a echo yep
(但如果操作数的第一部分有等号,则不起作用)
但这不会:
if "a ;" == ";,,=a" echo yep
因此,要在使用逗号时做出有效的IF
表达,您需要引号。这将起作用
setLocal enableDelayedExpansion
set test=testString
if "!test:~0,4!" == "test" echo Success
没有延迟的扩展替换立即进行,这将在没有引号的情况下工作:
set test=testString
setlocal disableDelayedExpansion
if %test:~0,4% == test echo Succes
endlocal
出于同样的原因,这将被视为错误的语法表达式(参见 jeb 的评论):
set "test="
setlocal disableDelayedExpansion
if %test% == test echo Succes
endlocal
可能不是完整的答案,但应该很接近。因为两者都echo !test:~0,4!
可以echo %test:~0,4%
在没有引号的情况下工作,这仍然是为什么完全IF
失败的问题 -可能是因为IF
命令使用它自己的解析器
作为结论 - 当您将字符串与以下内容进行比较时,使用引号总是很好的IF
:
- 带有延迟扩展的逗号和分号会造成麻烦。
- 没有延迟扩展未定义的变量会造成麻烦。