이 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


1
@fishbone과 우연히도 당신과 OP는 모두 1.3k의 명성을 가지고 있습니다.
p_champ

답변:


297

Maven은 배치 파일을 사용하여 비즈니스를 수행합니다. 배치 스크립트를 사용하는 call경우 호출 된 스크립트가 완료된 후 스크립트로 다시 돌아가도록 명령을 사용하여 다른 스크립트를 호출해야합니다 . call모든 명령 앞에 추가하십시오 .

시도 할 수있는 또 다른 것은 start비슷하게 작동 하는 명령을 사용하는 것 입니다.


1
내가 넣었습니다 ant전에 윈도우 배치 파일의 내부를하고는 call얻을 것을 요구되었다 ant실행. call배치가 없으면 첫 번째 명령 후에 중지되므로 두 번째 명령은 실행되지 않습니다. microsoft.com/resources/documentation/windows/xp/all/proddocs/…에 대한 자세한 내용은call
Owen

22
start새 창이 생성되고 세 명령 각각이 병렬로 실행됩니다. 동기식으로 실행해야하는 경우을 사용하십시오 call.
akf

11
스크립팅 환경이 이런 식으로 작동하는 것이 지구상에서 어떻게 의미가 있습니까? 두 개의 명령으로 스크립트를 작성한 경우 명령이 실행될 것으로 예상합니다. 나는 단지 그 명령 중 하나가 스크립트 자체로 구현되기 때문에 환경이 단순히 스크립트 실행을 중단하기로 결정하지 않을 것이라고 생각합니다.
bames53

3
@ bames53 : 이것은 Windows에서 명령 프롬프트를 현대적으로 구현 한 DOS에서 시작된 제한 사항입니다. Microsoft의 목표는 이전 버전과의 호환성을 유지하는 것이 었으므로 결과입니다.
Jeff Mercado

2
call pausecmd 창을 열어 두려면 끝에 따옴표없이 추가하십시오
JinSnow

28

데이 call도움이됩니다. 그러나 오늘은 그렇지 않았습니다.

이것이 내가 해결 한 방법입니다.

박쥐 파일 내용 ( cmds 중 하나 일 때 배치 를 중지 하려는 경우 )

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

박쥐 파일 내용 ( cmds 중 하나 일 때 배치 를 계속 하려는 경우 )

cmd1 & ^
cmd2 & ^
cmd3 & ^
cmd4

(여기서 첫 번째 예는 cmd1 && cmd2 && cmd3 && cmd4기본적으로 모든 명령을 한 줄로 만드는 것과 같습니다 .)
Ben Gotow

2
진실. 나는 bat 파일이기 때문에 그렇게 작성했습니다. 주로 여러 개의 긴 명령이있을 것입니다. 한 줄에 4 개의 명령은 향후 유지 관리에 좋지 않습니다. 가독성은 좋은 프로그램을 작성하는 데있어 핵심이며 다른 라인에 있습니다.
Manohar Reddy Poreddy

1
이 솔루션은 나를 위해 속임수를 사용했습니다. call솔루션은 오류에서 중지되지 않은이 일을 수행합니다.
Tim

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명령 이 있어야 exec하고 반환되지 않으므로 나머지 명령을 실행하지 않아야합니다.


스크립트가 다음 mvn명령 을 실행하도록하는 방법이 있습니까?
wiki

1

다음 배치 파일을 작성하고 실행하십시오.

Echo one
cmd
Echo two
cmd
Echo three
cmd

처음 두 줄만 실행됩니다. 그러나 명령 프롬프트에 "exit"를 입력하면 다음 두 줄이 처리됩니다. 다른 것을로드하는 쉘입니다.

이것이 스크립트에서 일어나고 있지 않은지 확인하려면 첫 번째 명령이 끝날 때 "exit"를 입력하십시오.

HTH!


있을 것 같지 않게; Maven은 실제로 배치 파일을 사용하므로이 파일을 사용해야 call합니다. 종료되지 않은 중첩 쉘이 아닙니다.
Joey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.