Выполнение нескольких команд из сценария Windows cmd


136

Я пытаюсь написать сценарий Windows cmd для выполнения нескольких задач в серии. Однако он всегда останавливается после первой команды в сценарии.

Команда, после которой он останавливается, является сборкой maven (не уверен, что это актуально).

Как мне заставить его выполнять и выполнять каждую задачу по очереди, пожалуйста?

Установка любого программного обеспечения или настройка реестра и т. Д. Полностью исключена - я боюсь, что она должна работать при установке Windows XP.

В идеале я бы хотел, чтобы скрипт прерывался, если какая-либо из команд не удалась, но это "приятно иметь", но не обязательно.

Спасибо.

Ответы:


139

Когда вы вызываете другой файл .bat, я думаю, что вам нужно «позвонить» перед вызовом:

call otherCommand.bat

1
Привет, в оригинальном сценарии я не вызывал другие файлы .cmd, но с тех пор я разбил его на отдельные файлы, чтобы я мог запускать каждый по очереди. Таким образом, размещение вызова перед каждой командой, кажется, добилось цели, спасибо!
Даррен Гривз

5
На самом деле, в Windows mvnэто файл .bat сам по себе, поэтому вам нужно использовать callего как в call mvn install; обычно вам не нужно создавать дополнительный cmd-файл.
jfpoilpret

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

@Gulzar Nazim - Знаете ли вы, могу ли я поместить все команды в один пакетный файл с помощью оператора if-else, поскольку я не хочу сохранять его в разных пакетных файлах?
Ng2-Fun

1
Я пытался сделать что-то подобное с npmобновлениями и protractorтестами. Я не думаю , что этот ответ применяется ко мне , пока я не понял , npmи protractorэто .cmdфайлы на Windows.
Джошден

45

Вы можете использовать символ && между командами, чтобы выполнить вторую команду, только если первая выполнена успешно. Более подробная информация здесь http://commandwindows.com/command1.htm


Спасибо, я попробую в сочетании с принятым ответом выше.
Даррен Гривз

Остановит ли это выполнение второго скрипта, если сборка maven не удалась?
Варун Ахар

Ссылка не работает: «Внутренний сервер не ответил вовремя. Сервер приложений слишком занят и не может своевременно обрабатывать запросы».
Кевинджи

1
@TheM Windows различает приложения на основе графического интерфейса и команд (в начале файла EXE есть флаг). Если вы запускаете приложение на основе графического интерфейса из командной строки, оно всегда заканчивается немедленно, так как оно полностью отсоединено от командной строки. Если вы запускаете командную программу из программы с графическим интерфейсом (например, Explorer), она всегда будет отображать новую командную строку. Системы POSIX не делают такого различия, поэтому поведение более последовательное.
coderforlife

2
@TheM Чтобы обойти это, вы можете использоватьstart /B /WAIT calc
coderforlife

25

Не уверен, почему первая команда останавливается. Если вы можете сделать это параллельно, вы можете попробовать что-то вроде

start cmd.exe /C 1.bat      
start cmd.exe /C 2.bat

7
Используйте /Kвместо, /Cесли вы хотите, чтобы оболочка оставалась открытой после выполнения вашей команды.
JellicleCat

Не нужно использовать cmd.exeи start, просто start x.bat1сделаю.
user66001

23

Я только что выполнил ту же самую задачу (ish) по созданию пакетного скрипта для запуска тестовых скриптов maven. Проблема в том, что вызов maven scrips с помощью 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

Обратите внимание на использование вызова. Это позволит использовать последовательные сценарии maven в командном файле.


5

Использование двойных амперсандов запускает вторую команду, только если первая удалась:

cd Desktop/project-directory && atom .

Где как, использование только одного амперсанда попытается выполнить обе команды, даже если первая не удалась:

cd Desktop/project-directory & atom .

1

Если вы работаете в Windows, вы можете использовать следующую команду.

Водить машину:

cd "Script location"
schtasks /run /tn "TASK1"
schtasks /run /tn "TASK2"
schtasks /run /tn "TASK3"
exit

1

Я не знаю прямого ответа на ваш вопрос, но если вы делаете много этих сценариев, возможно, стоит изучить более мощный язык, такой как perl. Для Windows существуют бесплатные реализации (например, activestate, cygwin). Я нашел, что стоит начальных усилий для моих собственных задач.

Редактировать:

По предложению @Ferruccio, если вы не можете установить дополнительное программное обеспечение, рассмотрите vbscript и / или javascript. Они встроены в хост скриптов Windows.


Спасибо, но я не могу установить программное обеспечение. Мне бы хотелось иметь доступ к чему-то более мощному, чем дерьмовый язык сценариев Windows. :-(
Даррен Гривз

6
Вы всегда можете использовать vbscript или javascript. Они встроены в хост скриптов Windows.
Ферруччо

0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.