Я пытаюсь заставить мои commit-build.bat
выполнять другие файлы .BAT как часть нашего процесса сборки.
Содержание commit-build.bat
:
"msbuild.bat"
"unit-tests.bat"
"deploy.bat"
Это кажется достаточно простым, но commit-build.bat
выполняет только первый элемент в списке ( msbuild.bat
).
Я запустил каждый из файлов отдельно без проблем.
batch-file
cmd
Yvette
источник
источник
Ответы:
Использование:
Если CALL не используется, текущий пакетный файл останавливается, и запускаемый вызываемый пакетный файл начинает выполняться. Это своеобразное поведение, восходящее к ранним дням MS-DOS.
источник
Все остальные ответы верны: используйте звонок. Например:
история
В древних версиях DOS было невозможно рекурсивно выполнять командные файлы. Затем была введена команда call, которая вызывала другую командную оболочку cmd для выполнения командного файла и вернула выполнение обратно в вызывающую командную оболочку, когда закончил.
Очевидно, что в более поздних версиях больше нет необходимости в другой оболочке cmd.
В первые дни многие пакетные файлы зависели от того, что вызов пакетного файла не вернется к вызывающему пакетному файлу. Изменение этого поведения без дополнительного синтаксиса нарушило бы многие системы, такие как системы пакетного меню (используя пакетные файлы для структур меню).
Как и во многих случаях с Microsoft, причиной такого поведения является обратная совместимость.
Советы
Если в ваших пакетных файлах есть пробелы в именах, используйте кавычки вокруг имени:
Кстати, если у вас нет всех имен пакетных файлов, вы также можете использовать для этого (это не гарантирует правильный порядок вызовов пакетных файлов; он следует порядку файловой системы):
Вы также можете реагировать на уровни ошибок после вызова. Использование:
вернуть уровень ошибки. 0 обозначает правильное выполнение. В вызывающем пакетном файле вы можете реагировать, используя
Используйте,
if errorlevel 1
если у вас Windows более старая, чем NT4 / 2000 / XP, чтобы перехватить все уровни ошибок 1 и выше.Для управления потоком командного файла есть goto :-(
Как отмечали другие: взгляните на системы сборки для замены командных файлов.
источник
errorlevel
пример команды дал мне проблему на Windows 10 (в CMD консоли). Я изменил команду просто такif errorlevel neq echo Houston We have a Problem!
. Мой пакетный процесс не имел проблем и завершался в основном нормально, но на каждом этапе использования этой команды после оператора call я получал «neq был неожиданным в это время». Думая, что они могли изменить неравный синтаксис, я попытался, но!=
также<>
продолжал получать ту же ошибку «в этот раз не ожидалось» для нового синтаксиса. что я могу делать не так?Если мы хотим открыть несколько командных строк, то мы могли бы использовать
/k
: обязательно, что выполнит.Запуск многих командных приглашений можно выполнить, как показано ниже.
источник
start "Window title" /wait cmd /k call something.bat
для того, чтобы запустить вещи в последовательном порядке.start "Window title" /wait cmd /c something.bat
, гдеcmd /c
закрывается окно, когда закончил)Пытаться:
источник
Вы вызываете несколько пакетов, чтобы скомпилировать программу. Я считаю само собой разумеющимся, что в случае возникновения ошибки:
1) программа в пакете завершит работу с уровнем ошибки;
2) Вы хотите знать об этом.
'||' проверяет уровень ошибки выше 0. Таким образом, все пакеты вызываются по порядку, но останавливаются при любой ошибке, оставляя экран, в котором вы видите любое сообщение об ошибке.
источник
Если у нас есть два пакетных сценария, aaa.bat и bbb.bat, и вызовите, как показано ниже
При выполнении сценария он сначала вызовет aaa.bat, дождется завершения потока aaa.bat и вызовет bbb.bat.
Но если вы не хотите ждать, пока aaa.bat завершит вызов bbb.bat, попробуйте использовать команду START :
Экзамен:
источник
источник
Чтобы вызвать
.bat
файл в.bat
файле, используйте(Да, это глупо, было бы больше смысла, если бы вы могли вызывать его
foo.bat
, как вы могли бы из командной строки, но правильный способ - использоватьcall
.)источник
Глядя на ваши имена файлов, вы рассматривали возможность использования инструмента сборки, такого как NAnt или Ant (версия Java). Вы получите намного больший контроль, чем с файлами bat.
источник
Если вы хотите открыть много командных файлов одновременно, вы можете использовать команду call. Однако команда call закрывает текущий файл bat и переходит к другому. Если вы хотите открыть много сразу, вы можете попробовать это:
И так далее или повторите запуск
cmd
"call
..." для любого количества файлов. Это работает для Windows 7 , но я не уверен насчет других систем.источник
Если это не работает, замените
start
сcall
или попробовать это:источник
Просто используйте
call
команду! Вот пример:источник
При правильном цитировании (иногда это бывает сложно):
1-й аргумент - заголовок (в данном случае пуст)
2-й аргумент - / D указывает начальный каталог, может быть пропущен, если требуется текущий рабочий каталог (например, «% ~ dp0»)
3-й аргумент - команда для запуска, «cmd.exe»
4-й arg - аргументы для команды, с двойными кавычками для аргументов внутри (это то, как вы избегаете кавычек в кавычках в пакете)
источник
Запуск нескольких скриптов в одном у меня была та же проблема. Я продолжал заставлять его умирать на первом, не понимая, что это выход на первом сценарии.
Я удалил все 11 из моих строк сценариев EXIT и попытался снова, и все 11 работали по порядку в одном и том же командном окне.
источник
exit
s, замените ихgoto :eof
вместо этого. Это «возвращение» кcall
@echo off :menu some commands goto menu
обратите внимание, что это будет выполнять непрерывный цикл до закрытия. в основном вам не нужно::
просто:
Следующее решило мою проблему:
источник
Может быть, вы хотите это:
Запустите пакетные сценарии параллельно
Здесь три пакетных файла запускаются в отдельных командных окнах в свернутом состоянии. Если вы не хотите минимизировать их, удалите
/min
. Кроме того, если вам не нужно управлять ими позже, тогда вы можете избавиться от названий. Таким образом, голая команда будетstart cmd /k call systemLogCollector.bat
Если вы хотите прекратить их-
источник