,;=<tab>
and <space>
are delimiters for cmd.exe and in many cases are ignored if they are not in quotes and act like empty space.Probably in this case ,
is taken as the end of the first operand and IF
is surprised that there is not valid comparison operator e.g. this will print yep
:
if a ;==;,,=a echo yep
(but will not work if there's a equal sign in the first part of the operands)
But this will not:
if "a ;" == ";,,=a" echo yep
so to make a valid IF
expression when you use comma you need quotes.And this will work
setLocal enableDelayedExpansion
set test=testString
if "!test:~0,4!" == "test" echo Success
Without delayed expansion substitution is made immediately and this will work without quotes:
set test=testString
setlocal disableDelayedExpansion
if %test:~0,4% == test echo Succes
endlocal
For the same reason this will be taken as a wrong syntax expression (see jeb's comment):
set "test="
setlocal disableDelayedExpansion
if %test% == test echo Succes
endlocal
May be is not the complete answer , but should be close.As both echo !test:~0,4!
and echo %test:~0,4%
will work without quotes stays the question why exactly IF
fails - may because IF
command uses its own parser
As a conclusion - it's always good to use quotes when you compare strings with IF
:
- with delayed expansion commas and semicolons will cause troubles.
- without delayed expansion undefined variables will cause troubles.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…