Я пытаюсь написать сценарий Windows cmd для последовательного выполнения нескольких задач. Однако он всегда останавливается после первой команды в сценарии.
Команда, после которой она останавливается, - это сборка maven (не уверен, что это актуально).
Как мне заставить его продолжать и выполнять каждую задачу по очереди?
Об установке какого-либо программного обеспечения или настройке реестра и т. д. Совершенно не может быть и речи - я боюсь, что это должно работать на обычной установке Windows XP.
В идеале я бы хотел, чтобы сценарий прервался, если какая-либо из команд не удалась, но это «неплохо», а не обязательно.
Спасибо.





Когда вы вызываете другой файл .bat, я думаю, вам нужно "call" перед вызовом:
call otherCommand.bat
Привет, в исходном скрипте я не вызывал другие файлы .cmd, но с тех пор разбил их на отдельные файлы, чтобы можно было запускать каждый по очереди. Итак, размещение вызова перед каждой командой, похоже, помогло, спасибо!
Фактически, в Windows mvn сам по себе является файлом .bat, поэтому для него нужно использовать call, как в call mvn install; обычно вам не нужно создавать дополнительный файл cmd.
Обратите внимание, что вам не нужны точки с запятой в пакетных файлах. И причина, по которой вам нужно использовать call, заключается в том, что mvn сам по себе является пакетным файлом, а пакетные файлы должны вызывать друг друга с помощью call, иначе управление не вернется к вызывающему.
@Gulzar Nazim - Знаете ли вы, могу ли я поместить все команды в один пакетный файл с оператором if-else, поскольку я не хочу поддерживать его в разных пакетных файлах?
Ирония заключается в том, что ответ указывает на противоположную сторону вопроса, и тем не менее он получает 120 голосов.
Я пытался сделать что-то подобное с обновлениями npm и тестами protractor. Я не думал, что этот ответ применим ко мне, пока я не понял, что npm и protractor являются файлами .cmd в Windows.
Я не знаю прямого ответа на ваш вопрос, но если вы используете много таких скриптов, возможно, стоит изучить более мощный язык, например perl. Для Windows существуют бесплатные реализации (например, activestate, cygwin). Я обнаружил, что для моих собственных задач это стоит первоначальных усилий.
Редактировать:
Как предлагает @Ferruccio, если вы не можете установить дополнительное программное обеспечение, рассмотрите vbscript и / или javascript. Они встроены в хост сценариев Windows.
Спасибо, но я не могу установить какое-либо программное обеспечение. Хотел бы я иметь доступ к чему-то более мощному, чем дрянной язык сценариев Windows. :-(
Вы всегда можете использовать vbscript или javascript. Они встроены в хост сценариев Windows.
Вы можете использовать символ && между командами, чтобы выполнить вторую команду, только если первая завершилась успешно. Подробнее здесь http://commandwindows.com/command1.htm
Спасибо, я попробую вместе с принятым ответом выше.
Остановит ли это выполнение второго скрипта, если сборка maven завершится неудачно?
Эта ссылка не работает: «Внутренний сервер не ответил вовремя. Сервер приложений слишком занят и не может вовремя обрабатывать запросы».
Может кто-нибудь объяснить мне, почему calc && echo foo приводит к запуску калькулятора и немедленной печати "foo"? Как я могу запустить calc таким образом, чтобы он блокировал оболочку Windows, как это делает bash без &?
@TheM Windows различает приложения на основе графического интерфейса и приложения на основе команд (в начале EXE-файла есть флажок). Если вы запускаете приложение на основе графического интерфейса пользователя из командной строки, оно всегда немедленно завершается, поскольку полностью отсоединено от командной строки. Если вы запустите программу на основе команд из программы с графическим интерфейсом (например, Explorer), она всегда будет отображать новую командную строку. Системы POSIX не делают такого различия, поэтому поведение более согласованное.
@TheM Чтобы обойти это, вы можете использовать start /B /WAIT calc
@coderforlife Я согласен с тем, что такое поведение несколько непоследовательно, но, по крайней мере, есть способ сделать это. Спасибо!
Не уверен, почему останавливается первая команда. Если вы можете сделать это параллельно, вы можете попробовать что-то вроде
start cmd.exe /C 1.bat
start cmd.exe /C 2.bat
Используйте /K вместо /C, если вы хотите, чтобы оболочка оставалась открытой после выполнения вашей команды.
Не нужно использовать cmd.exe и start, достаточно start x.bat1.
Если вы работаете в Windows, вы можете использовать следующую команду.
Водить машину:
cd "Script location"
schtasks /run /tn "TASK1"
schtasks /run /tn "TASK2"
schtasks /run /tn "TASK3"
exit
Я только что выполнял ту же самую (иш) задачу по созданию пакетного сценария для запуска тестовых сценариев maven. Проблема в том, что вызов сценариев maven с помощью mvn clean install ... сам по себе является сценарием, поэтому его нужно выполнять с помощью вызова mvn clean install.
Код, который будет работать
rem run a maven clean install
cd C:\rbe-ui-test-suite
call mvn clean install
rem now run through all the test scripts
call mvn clean install -Prun-integration-tests -Dpattern=tc-login
call mvn clean install -Prun-integration-tests -Dpattern=login-1
Обратите внимание на использование call. Это позволит использовать последовательные сценарии maven в пакетном файле.
Обратите внимание, что вам не нужны точки с запятой в пакетных файлах. И причина, по которой вам нужно использовать call, заключается в том, что mvn сам по себе является пакетным файлом, а пакетные файлы должны вызывать друг друга с помощью call, иначе управление не вернется к вызывающему.
Использование двойных амперсандов запустит вторую команду, только если первая будет успешной:
cd Desktop/project-directory && atom .
Где as, используя только один амперсанд, будет пытаться выполнить обе команды, даже если первая не удалась:
cd Desktop/project-directory & atom .
Вероятно, вы пытаетесь запустить bat-файл. Проверь это -> stackoverflow.com/a/64720570/388389