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


136

Я намагаюся написати сценарій cmd для Windows, щоб виконувати кілька завдань послідовно. Однак він завжди зупиняється після першої команди в сценарії.

Команда, після якої вона зупиняється, - це Maven build (не впевнений, що це актуально).

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

Встановлення будь-якого програмного забезпечення або налаштування реєстру тощо зовсім не викликає сумніву - я боюся, що він повинен працювати на ванільній установці Windows XP.

В ідеалі я хотів би, щоб сценарій перервав, якщо яка-небудь з команд не вдалася, але це "приємно мати", не суттєво.

Дякую.

Відповіді:


139

Коли ви викликаєте інший .bat файл, я думаю, вам потрібно "зателефонувати" перед викликом:

call otherCommand.bat

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

5
Власне кажучи, в Windows mvn- файл .bat сам по собі, тому вам потрібно використовувати callйого як в call mvn install; зазвичай не потрібно створювати додатковий файл cmd.
jfpoilpret

2
Зауважте, що вам не потрібні крапки з комою в пакетних файлах. І причина, чому вам потрібно використовувати виклик, полягає в тому, що сам mvn - це пакетний файл, а пакетні файли потрібно дзвонити один одному за допомогою виклику, інакше управління не повертається до абонента.
Пушкар

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

1
Я намагався зробити щось подібне з npmоновленнями та protractorтестами. Я не вважав, що ця відповідь стосується мене, поки я не зрозумів npmі protractorє .cmdфайлами в Windows.
Джошден

45

Ви можете використовувати символ && між командами для виконання другої команди, лише якщо перша успішна. Більше інформації тут http://commandwindows.com/command1.htm


Дякую, спробую разом із прийнятою відповіддю вище.
Даррен Грівз

Чи це зупинить виконання другого сценарію, якщо збірка Maven не вдасться?
Варун Ачар

Це посилання розірвано: "Сервер Backend не відповів вчасно. Сервер додатків занадто зайнятий і не може вчасно обробляти запити."
kevinji

1
@TheM Windows розрізняє програми, засновані на GUI та на основі команд (є прапор поблизу початку файлу EXE). Якщо ви запускаєте додаток на основі GUI з командного рядка, він завжди закінчується, оскільки він повністю від'єднаний від командного рядка. Якщо запустити командну програму з програми GUI (наприклад, 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

Я щойно виконував саме таке (іш) завдання - створити пакетний сценарій для запуску сценаріїв тестування Maven. Проблема полягає в тому, що виклик сценаріїв Maven з чистою установкою mvn ... сам по собі є сценарієм, і це потрібно робити при виклику 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

Зауважте, що вам не потрібні крапки з комою в пакетних файлах. І причина, чому вам потрібно використовувати виклик, полягає в тому, що сам mvn - це пакетний файл, а пакетні файли потрібно дзвонити один одному за допомогою виклику, інакше управління не повертається до абонента.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.