Todas las otras respuestas son correctas: use call. Por ejemplo:
call "msbuild.bat"
Historia
En versiones antiguas de DOS no era posible ejecutar recursivamente archivos por lotes. Luego, se introdujo el comando de llamada que llamó a otro cmd shell para ejecutar el archivo por lotes y devolvió la ejecución al cmd shell de llamada cuando finalizó.
Obviamente, en versiones posteriores ya no era necesario ningún otro cmd shell.
En los primeros días, muchos archivos por lotes dependían del hecho de que llamar a un archivo por lotes no volvería al archivo por lotes de llamada. Cambiar ese comportamiento sin una sintaxis adicional habría roto muchos sistemas, como los sistemas de menú por lotes (usando archivos por lotes para estructuras de menú).
Como en muchos casos con Microsoft, la compatibilidad con versiones anteriores es la razón de este comportamiento.
Consejos
Si sus archivos por lotes tienen espacios en sus nombres, use comillas alrededor del nombre:
call "unit tests.bat"
Por cierto: si no tiene todos los nombres de los archivos por lotes, también puede usar para hacer esto (no garantiza el orden correcto de las llamadas de archivos por lotes; sigue el orden del sistema de archivos):
FOR %x IN (*.bat) DO call "%x"
También puede reaccionar ante niveles de error después de una llamada. Utilizar:
exit /B 1 # Or any other integer value in 0..255
devolver un nivel de error. 0 denota la ejecución correcta. En el archivo por lotes de llamada puede reaccionar usando
if errorlevel neq 0 <batch command>
Úselo if errorlevel 1
si tiene un Windows anterior a NT4 / 2000 / XP para capturar todos los niveles de error 1 y superiores.
Para controlar el flujo de un archivo por lotes, hay goto :-(
if errorlevel 2 goto label2
if errorlevel 1 goto label1
...
:label1
...
:label2
...
Como otros señalaron: eche un vistazo a los sistemas de compilación para reemplazar los archivos por lotes.