Tutte le altre risposte sono corrette: usa la chiamata. Per esempio:
call "msbuild.bat"
Storia
Nelle antiche versioni DOS non era possibile eseguire in modo ricorsivo file batch. Quindi è stato introdotto il comando call che ha chiamato un'altra shell cmd per eseguire il file batch e al termine ha restituito l'esecuzione alla shell cmd chiamante.
Ovviamente nelle versioni successive non era più necessaria alcuna altra shell cmd.
All'inizio molti file batch dipendevano dal fatto che la chiamata a un file batch non sarebbe tornata al file batch chiamante. La modifica di tale comportamento senza sintassi aggiuntiva avrebbe interrotto molti sistemi come i sistemi di menu batch (utilizzando file batch per strutture di menu).
Come in molti casi con Microsoft, la compatibilità con le versioni precedenti è quindi la ragione di questo comportamento.
Suggerimenti
Se i tuoi file batch hanno spazi nei loro nomi, usa le virgolette attorno al nome:
call "unit tests.bat"
A proposito: se non si hanno tutti i nomi dei file batch, è possibile utilizzare anche per fare ciò (non garantisce l'ordine corretto delle chiamate di file batch; segue l'ordine del file system):
FOR %x IN (*.bat) DO call "%x"
Puoi anche reagire a livelli di errore dopo una chiamata. Uso:
exit /B 1 # Or any other integer value in 0..255
per restituire un livello di errore. 0 indica la corretta esecuzione. Nel file batch chiamante puoi reagire usando
if errorlevel neq 0 <batch command>
Uso if errorlevel 1
se si dispone di una Windows precedente a NT4 / 2000 / XP per rilevare tutti i livelli di errore 1 e superiori.
Per controllare il flusso di un file batch, c'è goto :-(
if errorlevel 2 goto label2
if errorlevel 1 goto label1
...
:label1
...
:label2
...
Come altri hanno sottolineato: dai un'occhiata ai sistemi di build per sostituire i file batch.