Как запустить несколько файлов .BAT в файле .BAT

Я пытаюсь заставить свой commit-build.bat выполнять другие файлы .BAT как часть нашего процесса сборки.

Содержимое commit-build.bat:

"msbuild.bat"
"unit-tests.bat"
"deploy.bat"

Это кажется достаточно простым, но commit-build.bat выполняет только первый элемент в списке (msbuild.bat).

Я запустил каждый из файлов отдельно без проблем.

Ответ 1

Использование:

call msbuild.bat
call unit-tests.bat
call deploy.bat

Если CALL не используется, текущий пакетный файл останавливается, и запускаемый вызываемый пакетный файл начинает выполняться. Это своеобразное поведение, восходящее к ранним дням MS-DOS.

Ответ 2

Все остальные ответы верны: используйте звонок. Например:

 call "msbuild.bat"

история

В древних версиях DOS было невозможно рекурсивно выполнять командные файлы. Затем была введена команда call, которая вызывала другую командную оболочку cmd для выполнения командного файла и вернула выполнение обратно в вызывающую командную оболочку, когда закончил.

Очевидно, что в более поздних версиях больше нет необходимости в других оболочках cmd.

В первые дни многие пакетные файлы зависели от того факта, что вызов пакетного файла не вернется к вызывающему пакетному файлу. Изменение этого поведения без дополнительного синтаксиса привело бы к поломке многих систем, таких как системы пакетного меню (использование пакетных файлов для структур меню).

Как и во многих случаях с Microsoft, причиной такого поведения является обратная совместимость.

подсказки

Если в ваших пакетных файлах есть пробелы в именах, используйте кавычки вокруг имени:

call "unit tests.bat"

Кстати, если у вас нет всех имен пакетных файлов, вы также можете использовать для этого (это не гарантирует правильный порядок вызовов пакетных файлов; он следует порядку файловой системы):

FOR %x IN (*.bat) DO call "%x"

Вы также можете реагировать на уровни ошибок после вызова. Использование:

exit /B 1   # Or any other integer value in 0..255

вернуть уровень ошибки. 0 обозначает правильное выполнение. В вызывающем пакетном файле вы можете реагировать, используя

if errorlevel neq 0 <batch command>

Используйте if errorlevel 1 если у вас Windows старше NT4/2000/XP, чтобы перехватить все уровни ошибок 1 и выше.

Для управления потоком командного файла есть goto :-(

if errorlevel 2 goto label2
if errorlevel 1 goto label1
...
:label1
...
:label2
...

Как отмечали другие: взгляните на системы сборки для замены командных файлов.

Ответ 3

Если мы хотим открыть несколько командных строк, то мы могли бы использовать

start cmd /k

/k: обязательно для выполнения.

Запуск многих командных приглашений можно выполнить, как показано ниже.

start cmd /k Call rc_hub.bat 4444

start cmd /k Call rc_grid1.bat 5555

start cmd /k Call rc_grid1.bat 6666

start cmd /k Call rc_grid1.bat 5570.

Ответ 4

Пытаться:

call msbuild.bat
call unit-tests.bat
call deploy.bat

Ответ 5

Вы вызываете несколько партий, чтобы скомпилировать программу. Я считаю само собой разумеющимся, что если произошла ошибка:
1) Программа внутри партии выйдет с уровнем ошибки;
2) Вы хотите знать об этом.

for %%b in ("msbuild.bat" "unit-tests.bat" "deploy.bat") do call %%b|| exit /b 1

'||' тесты для уровня ошибок выше 0. Таким образом, все партии вызываются по порядку, но останавливаются при любой ошибке, оставляя экран так, как вы видите сообщение об ошибке.

Ответ 6

call msbuild.bat
call unit-tests.bat
call deploy.bat

Ответ 7

Чтобы вызвать файл .bat в файле .bat, используйте

call foo.bat

(Да, это глупо, было бы разумнее, если бы вы могли называть его foo.bat, как вы могли бы из командной строки, но правильный способ - использовать call.)

Ответ 8

Если у нас есть два пакетных сценария, aaa.bat и bbb.bat, и вызовите, как показано ниже

call aaa.bat
call bbb.bat

При выполнении сценария он сначала вызовет aaa.bat, дождется завершения потока aaa.bat и вызовет bbb.bat.

Но если вы не хотите ждать, пока aaa.bat завершит вызов bbb.bat, попробуйте использовать команду START :

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
  [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
  [/AFFINITY <hex affinity>] [/WAIT] [/B] [command/program]
  [parameters]

экзамен:

start /b aaa.bat
start /b bbb.bat

Ответ 9

Глядя на ваши имена файлов, вы рассматривали возможность использования инструмента сборки, такого как NAnt или Ant (версия Java). Вы получите гораздо больше контроля, чем с файлами Bat.

Ответ 10

Start msbuild.bat
Start unit-tests.bat
Start deploy.bat

Если это не сработает, замените start на call или попробуйте следующее:

Start msbuild.bat
Goto :1
:1
Start unit-tests.bat
Goto :2
:2
Start deploy.bat

Ответ 11

Если вы хотите открыть много командных файлов одновременно, вы можете использовать команду call. Однако команда call закрывает текущий bat файл и переходит к другому. Если вы хотите открыть много сразу, вы можете попробовать это:

@echo off
start cmd "call ex1.bat&ex2.bat&ex3.bat"

И так далее или повторите запуск cmd " call..." для сколь угодно большого количества файлов. Это работает для Windows 7, но я не уверен насчет других систем.

Ответ 12

Запуск нескольких сценариев в одном я имел ту же проблему. Я продолжал умирать на первом, не понимая, что он выходит на первый script.

:: OneScriptToRunThemAll.bat
CALL ScriptA.bat
CALL ScriptB.bat
EXIT

:: ScriptA.bat
Do Foo
EXIT
::ScriptB.bat
Do bar
EXIT

Я удалил все 11 из моих строк EXIT строк и снова попытался, и все 11 выполнялись поочередно в одном командном окне.

:: OneScriptToRunThemAll.bat
CALL ScriptA.bat
CALL ScriptB.bat
EXIT

::ScriptA.bat
Do Foo

::ScriptB.bat
Do bar

Ответ 13

Просто используйте команду call ! Вот пример:

call msbuild.bat
call unit-tests.bat
call deploy.bat

Ответ 14

При правильном цитировании (иногда это бывает сложно):

start "" /D "C:\Program Files\ProgramToLaunch" "cmd.exe" "/c call ""C:\Program Files\ProgramToLaunch\programname.bat"""

1-й аргумент - заголовок (в данном случае пуст)
2nd arg -/D указывает начальный каталог, может быть опущен, если требуется текущий рабочий каталог (например, "% ~ dp0")
3-й аргумент - команда для запуска, "cmd.exe"
4-й аргумент - аргументы команды, с двойными кавычками для аргументов внутри нее (это то, как вы избегаете кавычек внутри кавычек в пакете)

Ответ 15

Вот мой путь =

cmd /c ""Path_Bat_Here.bat" %ARG%"
:: Or =
Call *.bat

Помощь = cmd/?

Ответ 16

Следующее решило мою проблему:

start call "batch1.bat"
start call "batch2.bat"