Выполнение нескольких команд из сценария 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 в командном файле.

mhollander38
источник
5

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

cd Desktop/project-directory && atom .

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

cd Desktop/project-directory & atom .
JSON C11
источник
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, иначе управление не возвращается вызывающей стороне.

Пушкарь
источник