Последовательный запуск пакетных файлов

Я хочу спросить вас всех, как последовательно запускать пакетные файлы в Windows. Я пытался :

start /w batchfile_1.bat 
start /w batchfile_2.bat
..
start /w batchfile_n.bat

но я должен закрыть предыдущий процесс файла .bat вручную (например, щелкнув), прежде чем перейти к следующему. Есть ли какое-либо решение сделать это автоматически, без того, чтобы я каждый раз вручную закрывал предыдущую программу .bat?

Большое спасибо.


person user1634603    schedule 29.08.2012    source источник
comment
Вы пробовали просто запускать их без start /w? Прошло некоторое время, но они должны работать по порядку, ждать завершения друг друга, а не открываться в новых окнах и тому подобное, требующее ввода пользователя.   -  person Brad    schedule 30.08.2012
comment
Я бы проверил решения этого вопроса: environment">Запустить несколько пакетных файлов   -  person Ishikawa    schedule 30.08.2012
comment
@Brad: Да, без запуска /w или только с помощью запуска файлы .bat будут запускаться одновременно, а не последовательно, как я хотел. Я также использовал вызов, но он также заставляет несколько файлов .bat запускаться одновременно.   -  person user1634603    schedule 30.08.2012
comment
@ user1634603, Нет, попробуйте вообще не использовать start или call.   -  person Brad    schedule 30.08.2012
comment
Глупо ставить близкое голосование, не обращая больше внимания на комментарии. Извини.   -  person Andriy M    schedule 31.08.2012


Ответы (3)


Я бы проверил решения этого вопроса: environment">Запустить несколько пакетных файлов

  • Взято из ответа по ссылке.

Используйте вызов:

call bat1.cmd
call bat2.cmd

По умолчанию, когда вы просто запускаете пакетный файл из другого элемента управления, он не переходит обратно к вызывающему. Вот почему вам нужно использовать call.

В принципе, если у вас есть такая партия:

@echo off
echo Foo
batch2.cmd
echo Bar

тогда будет только вывод

Foo

Если написать так

@echo off
echo Foo
call batch2.cmd
echo Bar

тем не менее, он будет выводить

Foo
Bar

потому что после того, как пакет2 завершается, управление программой возвращается к исходному пакетному файлу.

person Ishikawa    schedule 29.08.2012
comment
Проще просто закончить первый пакетный файл, выполнив (а не calling) второй, второй выполнит третий и так далее. Если вы хотите, чтобы они гарантированно запускались последовательно, это единственный способ сделать это; если один из них выйдет из строя, он не вызовет следующий, и цепочка выполнения будет разорвана. - person Ken White; 30.08.2012
comment
Но что произойдет, если OP (или кто-либо еще) захочет позже изменить или добавить порядок пакетных файлов. Не будет ли этот путь проще? Где все батники запускаются из одного основного файла? - person Ishikawa; 30.08.2012
comment
Проблема с call может быть проблемой с одним из файлов в последовательности, из-за которой он закрывается раньше, и последующие файлы все равно будут выполняться, когда управление вернется к основному файлу. Вы не можете гарантировать, что последовательность будет выполняться строго по порядку. (Не отрицая ваш ответ, просто комментируя.) - person Ken White; 30.08.2012
comment
Ах, я вижу, я тоже новичок в этом, поэтому я не думал об этом. Я предполагаю, что это сработает, если порядок пакетного файла не совсем важен, а просто должен запускаться одновременно. Спасибо за ваш вклад. - person Ishikawa; 30.08.2012
comment
@KenWhite Проблема с call ... Нет, если вы используете EXIT /b и проверяете, что код ошибки равен 0, прежде чем запускать следующий файл. - person James K; 30.08.2012
comment
@JamesK: Но что, если что-то неожиданное произойдет до того, как вы достигнете EXIT /b? Если пакетный файл не достигает этой строки, но завершается преждевременно, следующий call все еще выполняется. Если вы сцепите пакетные файлы, этого не произойдет; сбой останавливает выполнение следующего файла. - person Ken White; 30.08.2012
comment
@KenWhite: Но если вы установите уровень ошибки, скажем, 1000, при выходе, то, если он вернется с любым другим кодом, вы знаете, что он сломался. Как EXIT /b 1000 (признаюсь, изначально я думал, что код ошибки немного надежнее, чем он есть на самом деле.) - person James K; 30.08.2012
comment
@JamesK: Да, если вы прыгнете через миллион циклов, чтобы добраться туда, вы можете сделать это так, как вы предлагаете; или вы можете просто вызывать их последовательно, как я сказал, и не бороться с этим. <грамм> - person Ken White; 30.08.2012
comment
Иногда ты должен делать то, что должен! ^_^ - person James K; 30.08.2012

Если вам нравится использовать START, ваши пакетные файлы могут заканчиваться командой EXIT. Это закроет окна, созданные командой start.

@echo off
 .
 .
:: Inspired coding
 .
 .
exit
person James K    schedule 30.08.2012
comment
Кстати, не используйте EXIT /b с пакетными файлами, которые вы STARTed. Он не закрывает окна и предназначен для передачи уровня ошибки обратно вызывающему файлу. Это невозможно, потому что вы запустили отдельную среду cmd.exe с помощью START. - person James K; 30.08.2012
comment
Спасибо за предложение. Однако с помощью команды выхода действительно закрываются окна, которые появлялись, когда я запускаю .bat, но процесс выполняется одновременно, а не последовательно, как я хотел. - person user1634603; 30.08.2012

Я не уверен, но, судя по вашим комментариям, при выполнении этой последовательности команд START происходит следующее:

  1. Вызывается команда START /W, которая запускает пакетный файл.

  2. Пакетный файл начинает выполняться и запускает программу.

  3. Пакетный файл завершается, и его консольное окно остается открытым, но программа продолжает работать.

  4. Команда START /W, которая использовалась для запуска пакетного файла, все еще выполняется, поскольку окно консоли остается открытым.

  5. Вы ждете, пока программа завершится, затем вы закрываете окно консоли, а затем вызывается следующая команда START /W, и все повторяется.

Теперь, если вы поместите EXIT в конце каждого пакетного файла, который хотите запустить последовательно, это ухудшит ситуацию, потому что это приведет к закрытию окна консоли после завершения пакетного сценария, а это, в свою очередь, завершит соответствующую команду START /W и вызовет другой для выполнения, даже если программа, вызванная пакетным сценарием, все еще может быть запущена. Таким образом, получается, что пакетные сценарии (точнее, исполняемые ими программы) выполняются одновременно, а не последовательно.

Я думаю, что если это вообще можно решить, вам нужно переместить команду START /W и поместить ее в каждый пакетный файл перед (каждой) командой, которую этот пакетный файл выполняет и не ждет завершения. То есть, если ваш batchfile_1.bat запускает program.exe, измените командную строку на START /W program.exe и аналогично для других соответствующих команд в других пакетных файлах.

person Andriy M    schedule 31.08.2012