Как запустить несколько.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.
вы вызываете несколько пакетов в попытке скомпилировать программу.
Я принимаю как должное, что если ошибка происходит:
1) программа внутри пакета выйдет с уровнем errorlevel;
2) вы хотите знать об этом.
for %%b in ("msbuild.bat" "unit-tests.bat" "deploy.bat") do call %%b|| exit /b 1
'||' тесты для уровня ошибок выше 0. Таким образом, все пакеты вызываются по порядку, но останавливаются при любой ошибке, оставляя экран таким, как он есть для вас, чтобы увидеть сообщение об ошибке.
вызов внутри используйте
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
Ура!