Why can I not get a substring of a delayed expansion variable in an if statement?
batch-file, cmd, delayedvariableexpansion, if-statement
Solution
npocmaka correctly diagnosed the problem that the IF command gets its own special parsing phase, and token delimiters within the variable expansion are causing problems.
Substitution also causes a problem:
:: This fails
if !test:String=!==test echo Success
The reason why normal expansion works is because that occurs before the IF parsing, but delayed expansion occurs after IF parsing.
An alternative to using quotes is to escape the problem characters.
:: Both of these work
if !test:~0^,4!==test echo Success
if !test:String^=!==test echo Success
Problem
Why does string-manipulation work inline in an if statement without using delayed expansion variables - but fails otherwise. For example: ``` set test=testString if %test:~0,4%==test echo Success ``` This works correctly; returning `Success`. However if I do the following: ``` setLocal enableDelayedExpansion set test=testString if !test:~0,4!==test echo Success ``` I receive the error - `4!==test was unexpected at this time.` Obviously you can get around this by doing something like `set comp=!test:~0,4!` then just using the `!comp!` variable in the if statement.