이 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.