Чому виконується лише перший рядок цього пакетного файлу Windows, але всі три рядки виконуються в командній оболонці?


171

У мене є пакетний файл, який виконує три команди Maven, одна за одною. Кожна команда може бути успішно виконана в сценарії - сама по собі !. Але коли я додаю всі три команди в один і той же файл, тільки перша виконується до виходу сценарію. Будь-яка ідея чому?

mvn install:install-file -DgroupId=gdata -DartifactId=base -Dversion=1.0 -Dfile=gdata-base-1.0.jar  -Dpackaging=jar -DgeneratePom=true
mvn install:install-file -DgroupId=gdata -DartifactId=blogger -Dversion=2.0 -Dfile=gdata-blogger-2.0.jar  -Dpackaging=jar -DgeneratePom=true
mvn install:install-file -DgroupId=gdata -DartifactId=blogger-meta -Dversion=2.0 -Dfile=gdata-blogger-meta-2.0.jar  -Dpackaging=jar -DgeneratePom=true

Крім того, якщо я копіюю всі три команди і вставляю їх у командну оболонку (cmd.exe), вони виконують одна за одною без проблем. Отже, це, мабуть, певна проблема із файлом dos batch.


2
Що за коінцендент: я прийшов сюди з тією самою проблемою, а також тими ж командами у своєму пакетному файлі - кілька рядків "mvn install: install-file" :-D
fishbone


1
@fishbone, і вони збігаються з репутацією
1,3 тис

Відповіді:


297

Maven використовує пакетні файли для своєї справи. З будь-яким пакетним сценарієм ви повинні викликати інший скрипт за допомогою callкоманди, щоб він міг повернутися до вашого сценарію після завершення викликаного сценарію. Спробуйте додати callвсі команди.

Інша річ, яку ви можете спробувати, це використання startкоманди, яка повинна працювати аналогічно.


1
Я розміщував antвсередині Windows пакетні файли раніше, і callпотрібно antбуло виконати. Без callпартії зупиняється після першої команди, отже, дві інші не виконуються. microsoft.com/resources/documentation/windows/xp/all/proddocs/… для отримання додаткової інформації проcall
Owen

22
startвикличе нове вікно на нерест, і кожна з трьох команд буде виконуватися паралельно. Якщо вам потрібно, щоб вони працювали синхронно, використовуйте call.
akf

11
Як на землі має сенс поведінка сценаристів таким чином? Якщо я написав сценарій з двома командами, я очікую виконання команд; Я не очікую, що середовище просто вирішить припинити виконання мого сценарію, просто тому, що одна з цих команд буде реалізована як сам сценарій.
bames53

3
@ bames53: це обмеження, яке виникло з DOS, який перейшов у сучасні реалізації командного рядка в Windows. Оскільки цілі Microsoft полягали у підтримці зворотної сумісності, це результат.
Джефф Меркадо

2
додайте call pauseнаприкінці (без лапок), якщо ви хочете залишати вікна cmd відкритими
JinSnow

28

Маючи callдопомогу. Однак сьогодні цього не сталося.

Ось як я це вирішив:

Вміст файлу Bat (якщо ви хочете зупинити партію, коли одна з cmds помилок)

cmd1 && ^
cmd2 && ^
cmd3 && ^
cmd4

Вміст файлу Bat (якщо ви хочете продовжити партію, коли одна з cmds помилок)

cmd1 & ^
cmd2 & ^
cmd3 & ^
cmd4

(Перший приклад тут рівнозначний cmd1 && cmd2 && cmd3 && cmd4, по суті, склавши всі команди в один рядок.)
Бен Готув

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

1
Це рішення зробило для мене трюк. callРішення не зупиняючись на помилки, це робить.
Тім

9

Щоб виконати більше збірок Maven з одного сценарію, ви повинні використовувати функцію виклику Windows таким чином:

call mvn install:install-file -DgroupId=gdata -DartifactId=base -Dversion=1.0 -Dfile=gdata-base-1.0.jar  -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -DgroupId=gdata -DartifactId=blogger -Dversion=2.0 -Dfile=gdata-blogger-2.0.jar  -Dpackaging=jar -DgeneratePom=true
call mvn install:install-file -DgroupId=gdata -DartifactId=blogger-meta -Dversion=2.0 -Dfile=gdata-blogger-meta-2.0.jar  -Dpackaging=jar -DgeneratePom=true

1

Має бути, що конкретна mvnкоманда execs і не повертається, тим самим не виконуючи решту команд.


Чи є спосіб змусити скрипт виконати наступну mvnкоманду?
wiki

1

Спробуйте написати наступний пакетний файл і виконати його:

Echo one
cmd
Echo two
cmd
Echo three
cmd

Виконуються лише перші два рядки. Але якщо в командному рядку набрати "вихід", наступні два рядки обробляються. Це оболонка, що завантажує іншу.

Щоб переконатися, що це не те, що відбувається у вашому сценарії, просто введіть "exit", коли перша команда закінчиться.

HTH!


Навряд чи; Maven дійсно використовує пакетний файл, саме тому їх потрібно використовувати call. Це не вкладена оболонка, яка не припиняється.
Джої
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.