Why I can't CALL "IF" and "FOR" neither in batch nor in the cmd?
batch-file
Solution
You are quite right.
`FOR`, `IF` and `REM` aren't normal internal commands (but for REM exists also a normal internal version). They use an own special parser (each a different one).
It seems that these commands are translated to a sort of token. Therefor you got such unexpected error messages (there are much more possible characters), the error/token character depends also of the Windows version (if I remember correct here). Probably the `CALL` command sees only the tokenized data from the original command.
Command blocks don't work at all with the call command, also `&|<>` don't work as expected.
call (a^|a)
Searches for a command/token `2`, so if you create a batch file named `2.bat` you can start it with `call (a^|a)`.
For further information about `CALL` Dostips:CALL me, or better avoid call Dostips:Limit CMD processing to internal commands, safer and faster?
Problem
To be honest I don't expect a satisfying answer here.These command cannot be called and that's it (as far as I know the only commands that cannot be used with call). Here are few examples with their output: ``` C:\Windows\system32>call @if a==a echo called ',' is not recognized as an internal or external command, operable program or batch file. C:\Windows\system32>call (@if a==a echo called) ';' is not recognized as an internal or external command, operable program or batch file. C:\Windows\system32>call if a==a echo called 'if' is not recognized as an internal or external command, operable program or batch file. C:\Windows\system32>call for %a in (1) do @echo called 'for' is not recognized as an internal or external command, operable program or batch file. C:\Windows\system32>call @for %a in (1) do @echo called '+' is not recognized as an internal or external command, operable program or batch file. C:\Windows\system32>call (@for %a in (1) do @echo called) ';' is not recognized as an internal or external command, operable program or batch file. ``` I have some suspicious , that IF and FOR are not in fact 'real' commands - they just decide to pass the command prompt control to the line (or brackets block) behind them or not , which confuses the call. Anyway even that , when there are syntax errors in called FOR or IF they are detected: ``` C:\Windows\system32>call (@if a= echo called) = was unexpected at this time. C:\Windows\system32>call (for %a (1) do echo called) (1 was unexpected at this time. ``` So at least the parsing is done.