.BAT 파일 내에서 여러 .BAT 파일을 실행하는 방법


695

commit-build.bat빌드 프로세스의 일부로 다른 .BAT 파일을 실행 하려고합니다 .

내용 commit-build.bat:

"msbuild.bat"
"unit-tests.bat"
"deploy.bat"

이것은 간단 해 보이지만 commit-build.bat목록의 첫 번째 항목 만 실행합니다 ( msbuild.bat).

문제없이 각 파일을 개별적으로 실행했습니다.


4
@sean-명령 줄 유틸리티가 작동하도록 전체 Cygwin 패키지를 설치할 필요는 없습니다. 모든 cygwin dll을 패키지에서 꺼내어 경로가 지정된 디렉토리에 놓고 모든 도구를 다른 경로가 지정된 디렉토리에 넣으면 좋습니다.
Techie Joe

이러한 각 파일이 일괄 처리 일 뿐이라고 가정하면 하나의 큰 파일에 넣고 시간 초과 기능을 사용하여 각 시간을 시작할 수 있습니다.
CMS_95

답변:


1201

사용하다:

call msbuild.bat
call unit-tests.bat
call deploy.bat

CALL을 사용하지 않으면 현재 배치 파일이 중지되고 호출 된 배치 파일이 실행되기 시작합니다. 초기 MS-DOS 시절로 거슬러 올라가는 독특한 행동입니다.


weird, 나는 Windows 7에서 "call"없이 시도했지만 그것이 효과가 있었음을 기억하지만 windows xp에서는이 명령이 필요했습니다. 그럴 수 있습니까?
안드로이드 개발자

7
호출없이 원래 DOS 사양에 따라 명령 체인을 수행하고 반환하지 않아야합니다. "CALL"이 추가되기 전에 널리 사용 된 옵션은 "command / c second.bat"와 같은 하위 명령 프롬프트를 여는 것입니다.
Brian Knoblauch

1
나는 윈도우 7 기업가에 문제가 있었기 때문에 그것은 XP뿐만 아니라
Rafiki

7
Windows 10에서는 첫 번째 줄만 실행됩니다. 그러나 farheen의 대답은 효과가있었습니다.
robro

2
배치 파일에 매개 변수를 전달하는 방법 및 매개 변수 중 하나는 공백이있는 경로입니다.
Zeus

180

다른 모든 답변은 정확합니다. 전화를 사용하십시오. 예를 들면 다음과 같습니다.

 call "msbuild.bat"

역사

고대 DOS 버전에서는 배치 파일을 재귀 적으로 실행할 수 없었습니다. 그런 다음 배치 파일을 실행하기 위해 다른 cmd 쉘이라는 호출 명령이 도입되었으며 완료되면 호출 cmd 쉘로 실행을 다시 반환했습니다.

분명히 이후 버전에서는 다른 cmd 쉘이 더 이상 필요하지 않았습니다.

초기에는 많은 배치 파일이 배치 파일 호출이 호출 배치 파일로 돌아 가지 않는다는 사실에 의존했습니다. 추가 구문없이 해당 동작을 변경하면 배치 메뉴 시스템 (메뉴 구조에 배치 파일 사용)과 같은 많은 시스템이 손상되었습니다.

많은 경우에 Microsoft와 마찬가지로 이전 버전과의 호환성이이 동작의 이유입니다.

배치 파일 이름에 공백이 있으면 이름 주위에 따옴표를 사용하십시오.

call "unit tests.bat"

그건 그렇고 : 배치 파일의 모든 이름을 가지고 있지 않은 경우에도 사용할 수 있습니다 (배치 파일 호출의 올바른 순서를 보장하지는 않습니다. 파일 시스템의 순서를 따릅니다).

FOR %x IN (*.bat) DO call "%x"

호출 후 오류 수준에 대응할 수도 있습니다. 사용하다:

exit /B 1   # Or any other integer value in 0..255

오류 수준을 돌려줍니다. 0은 올바른 실행을 나타냅니다. 호출 배치 파일에서 다음을 사용하여 반응 할 수 있습니다.

if errorlevel neq 0 <batch command>

if errorlevel 1NT4 / 2000 / XP보다 오래된 Windows를 사용하는 경우 모든 오류 수준 1 이상을 포착하십시오.

배치 파일의 흐름을 제어하려면 goto :-(

if errorlevel 2 goto label2
if errorlevel 1 goto label1
...
:label1
...
:label2
...

다른 사람들이 지적했듯이 배치 파일을 대체하는 빌드 시스템을 살펴보십시오.


동의하지만 루프는이 경우 파일을 잘못된 (알파벳 순서) 순서로 처리 할 수 ​​있습니다
Dave Archer

훌륭하고 완전한 답변. 제어 흐름을 포함하는 경우 goto 대신 call : label1을 사용하여 서브 루틴을 수행 할 수 있으며 배치 파일의 'return'문은 약간 이상한 goto : eof입니다. eof 레이블을 직접 작성하십시오 (기본적으로 존재 함).
레골라스

errorlevel명령 예제 (cmd를 콘솔에서) 윈도우 10 나에게 문제를했다. 명령을 간단히로 수정했습니다 if errorlevel neq echo Houston We have a Problem!. 내 일괄 처리 프로세스에는 아무런 문제가 없었으며 대부분 정상적으로 완료되었지만 전화 문의 후이 명령을 사용한 모든 단계에서 "현재는 예상치 못한 결과가 발생했습니다." 그들은 같지 않음 구문을 변경되었을 수 있습니다 생각, 나는 시도 !=<>하지만 새로운 구문은 동일한 "이 시점에서 예상하지"오류가 있었다. 내가 뭘 잘못하고 있니?
TMWP

118

여러 명령 프롬프트를 열려면

start cmd /k

/k: 실행할 강제입니다.

다음과 같이 많은 명령 프롬프트를 시작할 수 있습니다.

start cmd /k Call rc_hub.bat 4444

start cmd /k Call rc_grid1.bat 5555

start cmd /k Call rc_grid1.bat 6666

start cmd /k Call rc_grid1.bat 5570.


1
이것은 여러 명령 인스턴스를 실행하며 <pause>가있는 여러 배치 파일을 실행하는 경우에도 작동합니다. 이것이 내가 찾고있는 솔루션이므로 +1입니다!
Christian Noel

5
그 번호가 귀하의 답변에 있음을 설명해 주시겠습니까? 그들의 목적은 명확하지 않다.
Kalamalka Kid

3
대부분의 사람들은 아마도 start "Window title" /wait cmd /k call something.bat순차적으로 실행하기 위해 사용 하기를 원할 것입니다.
Andrew

3
(또는 start "Window title" /wait cmd /c something.bat, cmd /c완료되면 창을 닫는 위치 )
Andrew

42

시험:

call msbuild.bat
call unit-tests.bat
call deploy.bat

28

프로그램을 컴파일하기 위해 여러 배치를 호출하고 있습니다. 오류가 발생하면 다음과 같이 당연한 것으로 생각합니다.
1) 배치 내의 프로그램이 오류 수준으로 종료됩니다.
2) 당신은 그것에 대해 알고 싶어합니다.

for %%b in ("msbuild.bat" "unit-tests.bat" "deploy.bat") do call %%b|| exit /b 1

'||' 이 방법으로 모든 배치가 순서대로 호출되지만 오류가 발생하면 중지되어 오류 메시지가 표시되는 화면을 남깁니다.


23

aaa.bat와 bbb.bat라는 두 개의 배치 스크립트가 있고 아래와 같이 호출하면

call aaa.bat
call bbb.bat

스크립트를 실행할 때 먼저 aaa.bat를 호출하고 aaa.bat 스레드가 종료 될 때까지 기다린 다음 bbb.bat를 호출합니다.

그러나 aaa.bat가 bbb.bat를 호출하기를 기다리지 않으려면 START 명령 을 사용하십시오 .

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
  [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
  [/AFFINITY <hex affinity>] [/WAIT] [/B] [command/program]
  [parameters]

시험:

start /b aaa.bat
start /b bbb.bat


20

.bat파일 내에서 .bat파일 을 호출하려면

call foo.bat

(예, 이것은 어리석은 일 foo.bat입니다. 명령 프롬프트에서와 같이 호출 할 수 있으면 더 이해가 되지만 올바른 방법은을 사용하는 것 call입니다.)


7

파일 이름을 살펴보면 NAnt 또는 Ant (Java 버전) 와 같은 빌드 도구를 사용하는 것을 고려했습니다 . 박쥐 파일보다 훨씬 많은 제어력을 얻을 수 있습니다.


7

한 번에 많은 배치 파일을 열려면 call 명령을 사용할 수 있습니다. 그러나 call 명령은 현재 bat 파일을 닫고 다른 파일로갑니다. 한 번에 여러 개를 열려면 다음을 시도하십시오.

@echo off
start cmd "call ex1.bat&ex2.bat&ex3.bat"

그러나 많은 파일에 대해서는 시작 cmd" call..."을 반복하거나 반복 하십시오. 이것은 Windows 7 에서 작동 하지만 다른 시스템에 대해서는 확실하지 않습니다.


6
Start msbuild.bat
Start unit-tests.bat
Start deploy.bat

그래도 문제가 해결되지 않으면 교체 start와 함께 call또는이 시도 :

Start msbuild.bat
Goto :1
:1
Start unit-tests.bat
Goto :2
:2
Start deploy.bat

3

그냥 call명령을 사용하십시오 ! 예를 들면 다음과 같습니다.

call msbuild.bat
call unit-tests.bat
call deploy.bat

3

올바른 인용으로 (때로는 까다로울 수 있음) :

start "" /D "C:\Program Files\ProgramToLaunch" "cmd.exe" "/c call ""C:\Program Files\ProgramToLaunch\programname.bat"""

첫 번째 arg-제목 (이 경우 비어 있음)
두 번째 arg-/ D는 시작 디렉토리를 지정합니다. 현재 작업중인 디렉토리 (예 : "% ~ dp0")를 원하면 생략 할 수 있습니다.
3 번째 arg- 시작 명령, "cmd.exe"
4 번째 arg-내부의 인수에 대해 따옴표가 두 배인 명령에 대한 인수


2

하나의 스크립트를 여러 개 실행하면 동일한 문제가 발생했습니다. 나는 그것이 첫 번째 스크립트에서 종료되고 있음을 깨닫지 못하고 첫 번째에서 죽게했습니다.

:: OneScriptToRunThemAll.bat
CALL ScriptA.bat
CALL ScriptB.bat
EXIT

:: ScriptA.bat
Do Foo
EXIT
::ScriptB.bat
Do bar
EXIT

EXIT 줄 11 개를 모두 제거하고 다시 시도했으며 11 개가 모두 같은 명령 창에서 한 번에 하나씩 순서대로 실행되었습니다.

:: OneScriptToRunThemAll.bat
CALL ScriptA.bat
CALL ScriptB.bat
EXIT

::ScriptA.bat
Do Foo

::ScriptB.bat
Do bar

exits를 제거하지 말고 goto :eof대신으로 교체하십시오 . 이것은 call
Stephan

간단한 배치 명령에서 명령은 인덱스의 기본 레이아웃이라고 불리는 순서대로 실행된다는 것을 알고 있으며, @echo off :menu some commands goto menu닫힐 때까지 연속 루프를 실행합니다. 기본적으로 당신은 ::단지 필요하지 않습니다:
CMS_95 18

0

다음은 내 문제를 해결했습니다.

start call "batch1.bat"
start call "batch2.bat"

0

당신이 이것을 원할 수도 있습니다 :

배치 스크립트를 병렬로 실행하십시오.

start "systemLogCollector" /min cmd /k call systemLogCollector.bat
start "uiLogCollector" /min cmd /k call uiLogCollector.bat
start "appLogCollector" /min cmd /k call appLogCollector.bat

여기서 3 개의 배치 파일은 최소화 된 상태로 별도의 명령 창에서 실행됩니다. 최소화하지 않으려면을 제거하십시오 /min. 또한 나중에 제어 할 필요가없는 경우 제목을 제거 할 수 있습니다. 따라서 베어 본 명령은start cmd /k call systemLogCollector.bat


당신이 그들을 종료하려는 경우-

taskkill /FI "WindowTitle eq appLogCollector*" /T /F
taskkill /FI "WindowTitle eq uiLogCollector*" /T /F
taskkill /FI "WindowTitle eq systemLogCollector*" /T /F
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.