Por que não consigo chamar "IF" e "FOR" nem em lote nem no cmd?
Para ser honesto, não espero uma resposta satisfatória aqui. Esse comando não pode ser chamado e é isso (até onde sei os únicos comandos que não podem ser usados com chamadas). Aqui estão alguns exemplos com sua saída:
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.
Eu tenho algumas suspeitas, que IF e FOR não são de fato comandos 'reais' - eles apenas decidem passar o controle de prompt de comando para a linha (ou bloco de colchetes) por trás deles ou não, o que confunde a chamada. Enfim, mesmo que, quando há erros de sintaxe em chamado FOR ou se eles são detectados:
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.
Então, pelo menos, a análise é feita.