DEFER was never intended for executing batch files, and would in fact require rewriting the parser to support that.
But since I can't think of any reason why you would need to DEFER a batch file, I don't think it's a significant limitation (and nobody has found any reason to do it for 20 years!).
I think DEFER only goes back seven or eight years. I can't think of a reason one would *NEED* to DEFER anything (and if there is, I don't see why batch file should be special). DEFER seems to be just a convenience.
Anyway, if the help spelled things out more, this question might not have been raised. Experimentation leads me to believe that when DEFER'd commands are executed ...
1. you're still in the batch interpreter (and _batch = 1 and external apps are waited for)
2. an automatic, end-of-batch ENDLOCAL has taken place
3. ON handlers have been cancelled
4. batch arguments no longer exist and trying to refer to them causes trouble ... for example, if you run this one (below) once, you won't see the arg0 line and thereafter TCC won't run any batch files.
Code:
v:\> type deferbat.btm
echo I am %0
defer echo arg0 = %%0
quit
As for DEFERing batch files, "DEFER CALL batchfile" seems to work OK and may satisfy DJ's original purposes.