Как запустить несколько файлов .BAT в файле .BAT - PullRequest
630 голосов
/ 09 июля 2009

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

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

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

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

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

Ответы [ 14 ]

1068 голосов
/ 09 июля 2009

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

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

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

165 голосов
/ 09 июля 2009

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

 call "msbuild.bat"

History

В древних версиях DOS было невозможно рекурсивно выполнять командные файлы.Затем была введена команда call, которая вызвала другую оболочку cmd для выполнения командного файла и вернула выполнение обратно в вызывающую оболочку 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 и выше.

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

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

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

103 голосов
/ 27 августа 2012

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

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.
40 голосов
/ 09 июля 2009

Попробуйте:

call msbuild.bat
call unit-tests.bat
call deploy.bat
26 голосов
/ 18 августа 2009

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

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

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

21 голосов
/ 09 июля 2009
call msbuild.bat
call unit-tests.bat
call deploy.bat
19 голосов
/ 09 июля 2009

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

call foo.bat

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

17 голосов
/ 29 октября 2013

Если у нас есть два пакетных сценария, 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
6 голосов
/ 09 июля 2009

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

5 голосов
/ 15 августа 2014
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...