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

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

контент commit-build.bat:

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

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

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

13 ответов


использовать

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

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


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

 call "msbuild.bat"

история

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

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

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

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


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

start cmd /k 

/k: является обязательным, который будет выполняться.

запуск многих команд propmts можно сделать, как показано ниже.

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.

попробовать

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

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

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

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


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

вызов внутри используйте

call foo.bat

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


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

call aaa.bat
call bbb.bat

при выполнении скрипта он вызовет aaa.летучая мышь и дождитесь, пока нити ААА.bat terminate затем вызовет bbb.летучая мышь!--4-->

но если вы не хотите ждать 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

глядя на ваши имена файлов, вы рассматривали возможность использования инструмента сборки, как nant или ant (версия java). Вы получите гораздо больше контроля, чем bat files


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

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

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

и так далее или повторить старт cmd "call...- сколько угодно файлов. это работает для WIN 7 Не уверен в других системах.


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

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

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

Я удалил все 11 строк выхода моих скриптов и попробовал еще раз, и все 11 побежали по порядку по одному в том же окне команды.

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

::ScriptA.bat
Do Foo

::ScriptB.bat
Do bar

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

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

Ура!