Как запустить несколько файлов .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"