Я пытаюсь заставить мой commit-build.bat
выполнять другие .BAT файлы как часть нашего процесса сборки.
Содержимое commit-build.bat
:
"msbuild.bat"
"unit-tests.bat"
"deploy.bat"
Это кажется достаточно простым, но commit-build.bat
выполняет только первый элемент в списке (msbuild.bat
).
Я запускал каждый из этих файлов отдельно без проблем.
Используйте:
call msbuild.bat
call unit-tests.bat
call deploy.bat
Если не использовать CALL, текущий пакетный файл останавливается, а вызываемый пакетный файл начинает выполняться. Это своеобразное поведение, восходящее к ранним дням MS-DOS.
Все остальные ответы являются правильными: использовать звонок. Например:
call "msbuild.bat"
История
В Древней DOS версии не было возможности рекурсивно выполнить пакетные файлы. Затем команда вызова, который называют еще одну оболочку cmd, чтобы выполнить пакетный файл и вернул выполнения вызывающему оболочки cmd, когда закончите.
Очевидно, в более поздних версиях никакой другой оболочки cmd больше не было необходимости.
В первые дни много пакетных файлов зависит от того, что вызов пакетного файла не вернется в вызывающий пакетный файл. Изменить это поведение без дополнительного синтаксиса, разбило бы многих систем, таких как системы пакетной меню (используя пакетные файлы для меню структуры).
Как и во многих случаях с Microsoft, поэтому обратной совместимости является причиной такого поведения.
Советы
Если ваши пакетные файлы, содержащие пробелы в именах, используйте кавычки вокруг имени:
call "unit tests.bat"
Кстати: если вы не имеете имена всех пакетных файлов, можно также использовать для того чтобы сделать это (это не гарантирует правильный порядок пакетный файл вызовов; он следит за порядком файловой системы):
FOR %x IN (*.bat) DO call "%x"
Вы можете также реагировать на errorlevels после звонка. Использование:
exit /B 1 # Or any other integer value in 0..255
чтобы восстановить значение errorlevel. 0 обозначает правильное выполнение. В вызове пакетного файла вы можете реагировать с помощью
if errorlevel neq 0 <batch command>
Если значение errorlevel 1` Если у вас есть старые окна, чем это NT4/2000/XP, чтобы поймать все errorlevels 1 и больше.
Чтобы контролировать поток пакетный файл, есть Гото :-(
if errorlevel 2 goto label2
if errorlevel 1 goto label1
...
:label1
...
:label2
...
Как отметили другие: посмотреть на системы сборки для замены пакетных файлов.
Если мы хотим открыть несколько командных строк, то мы могли бы использовать
start cmd /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.
Вы звоните несколько партий в попытке скомпилировать программу. Я беру за аксиому, что если возникает ошибка:
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
Если у нас есть два пакетных скриптах, ААА.летучая мышь и ВВВ.BAT и вызов, как показано ниже
call aaa.bat
call bbb.bat
При выполнении скрипта, он будет звонить в ААА.летучая мышь во-первых, ждать нить ААА.летучая мышь завершить, и звонить ВВВ.летучая мышь.
Но если вы Don'т хотите ждать ААА.bat, чтобы прекратить называть БББ.летучая мышь, попробуйте использовать пуск команда:
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
Для вызова .файл BAT
в `.bat файл, используйте
call foo.bat
(Да, это глупо, было бы больше смысла, если вы могли бы назвать это с `Foo.летучая мышь, как можно из командной строки, но правильный способ-это использовать "вызов".)
Глядя на ваши имена, вы рассматривали с помощью инструмента построить как Нант или муравей (Java-версия). Вы'll получить гораздо больше контроля, чем с bat файлы.
Start msbuild.bat
Start unit-tests.bat
Start deploy.bat
Если это не't работа, замените "старт" с вызов
или попробуйте это:
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 в"
призыв`..." и однако для многих файлов. Это работает для окна&ампер;усилитель; nbsp;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 msbuild.bat
call unit-tests.bat
call deploy.bat
С правильной ссылкой (Это может быть иногда сложно):
start "" /D "C:\Program Files\ProgramToLaunch" "cmd.exe" "/c call ""C:\Program Files\ProgramToLaunch\programname.bat"""
1-й параметр - название (пустая в данном случае)<БР> 2-й арг - /D задает начальный каталог, может быть опущен, если требуется, чтобы текущая работа реж (таких как "%~dp0" в)<БР> 3й параметр - команда для запуска "и УМК.ехе" и<БР> 4-е арг - аргументы команды, с удвоенными цитаты для аргументов в этом (это, как вы бежать цитаты в кавычки в пакете)
Вот мой способ =
cmd /c ""Path_Bat_Here.bat" %ARG%"
:: Or =
Call *.bat
Помочь = КМД /?