Почему выполняется только первая строка этого командного файла 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.

вики
источник
2
Что за совпадение: я пришел сюда с той же проблемой, а также с теми же командами в моем пакетном файле - несколько строк «mvn install: install-file» :-D
fishbone
Возможный дубликат Как запустить несколько файлов .BAT в файле .BAT
Питер Мортенсен,
1
@fishbone и, по совпадению, вы и OP оба имеете 1.3k репутации ..
p_champ

Ответы:

298

Maven использует командные файлы для ведения бизнеса. С любым пакетным сценарием вы должны вызвать другой сценарий, используя callкоманду, чтобы он знал, чтобы вернуться к вашему сценарию после завершения вызванного сценария. Попробуйте присоединиться callко всем командам.

Другая вещь, которую вы можете попробовать, это использовать startкоманду, которая должна работать аналогично.

Джефф Меркадо
источник
1
Я поместил antв пакетные файлы Windows раньше, и callбыло необходимо, antчтобы выполнить. Без callпакета остановится после первой команды, следовательно, вторая не выполняется. microsoft.com/resources/documentation/windows/xp/all/proddocs/… для получения дополнительной информацииcall
Оуэн
22
startприведет к появлению нового окна, и каждая из трех команд будет работать параллельно. Если вам нужно, чтобы они работали синхронно, используйте call.
АКФ
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
Seweryn Habdank-Wojewódzki
источник
1

Должно быть, что конкретная mvnкоманда execs и не возвращается, тем самым не выполняя остальные команды.

Алан Хаггай Алави
источник
Есть ли способ заставить скрипт выполнить следующую mvnкоманду?
wiki
1

Попробуйте написать следующий пакетный файл и выполнить его:

Echo one
cmd
Echo two
cmd
Echo three
cmd

Только первые две строки выполняются. Но если вы введете «exit» в командной строке, будут обработаны следующие две строки. Это оболочка, загружающая другую.

Чтобы убедиться, что это не то, что происходит в вашем скрипте, просто введите «выход», когда первая команда заканчивается.

НТН!

Доктор Велизарий
источник
Вряд ли; Maven действительно использует командный файл, поэтому их нужно использовать call. Это не вложенная оболочка, которая не завершена.
Джои