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.
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?
After all it is possible to call IF and FOR ..or almost;
@echo off
rem :: this will produce an error
rem if a equ a
rem :: And this too
rem call if a equ a rem
rem :: But this will not!!!
call if a equ a
rem :: This will not too ((\but in command prompt single % is enough)
call for %%%%a in (.) do
rem :: And this
call if a equ a for %%%%a in (.) do if 1 equ 1 for %%%%a in (.) do if c==c
rem :: And this
call if a equ a for %%%%a in (.) do if 1 equ 1 for %%%%a in (.) do if c==c ( rem rem rem echo something
Despite I see no usage of this.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With