As Alan B wrote, the .bat interpreter is completely different: command.com in MS-DOS, cmd.exe in modern Windows versions.
A related question on Stack Overflow gives a good insight, especially this answer. I won't duplicate it here, just a snippet:
Here is a list of cmd.exe features that are not supported by command.com:
Long filenames (exceeding the 8.3 format)
Escape character: ^ (Use for: \ & | > < ^)
Directory stack: PUSHD/POPD
Integer arithmetic: SET /A i+=1
Search/Replace/Substring: SET %varname:expression%
Command substitution: FOR /F (existed before, has been enhanced)
Functions: CALL :label
I'd add from personal experience the FOR command, which is essential to pretty much any batch file to process, well, batches :-) was introduced in MS-DOS 5.0 but was quite limited back then. Command extensions and substitution of variables came with CMD.EXE.
Just for the fun: if you run
for /? in a windows 10 command prompt, the first lines of text are 100% identical to the ones in MS-DOS 5.0 (which was released in 1991). This is what I call backward compatibility!
Here are allowed batch commands in MS-DOS 6.22 (as taken directly from MS-DOS 6.22 HELP command). They still work as intended as of Windows 10:
Call Calls one batch program from another without causing the first batch program to stop.
If Performs conditional processing in batch programs. If the condition specified by an IF command is true, MS-DOS carries out the command that follows the condition. If the condition is false, MS-DOS ignores the command.
Choice Permits the user to make a choice in a batch program. Displays a specified prompt and pauses for the user to choose from among a specified set of keys.
Pause Suspends processing of a batch program and displays a message that prompts the user to press any key to continue.
Echo Displays or hide the text in batch programs when the program is running. Also indicates whether the command-echoing feature is on or off. You can also use the echo command to display a message.
Rem Enables you to include comments in a batch file.
For Runs a specified command for each file in a set of files.
Shift Changes the position of replaceable paramaters in a batch program.
Goto Directs MS-DOS to a line in a batch program that is marked by a label you specify.
The following commands have command extensions in CMD.EXE (but remain backward compatible)
Call CALL command now accepts labels as the target of the CALL.
If IF [/I] string1 compare-op string2 command (compare-op can be EQU, NEQ, LSS, LEQ, GTR, GEQ)
IF CMDEXTVERSION number command (not really sure what it does)
IF DEFINED variable command (returns true if the environment variable is defined)
Choice Adds a few switches such as
/CS Enables case-sensitive choices to be selected.
By default, the utility is case-insensitive.
/D Specifies the default choice after nnnn seconds.
/M Specifies the message to be displayed before the prompt. (in MS-DOS, no switch is required for this)
For As stated above, this is a command that has been improved a lot. Too many extensions to print here :) Check http://ss64.com/nt/cmd.html
Goto GOTO command now accepts a target label of :EOF which transfers control to the end of the current batch script file.
(Compiled from running help in a windows 10 command prompt)