commit-build.bat
빌드 프로세스의 일부로 다른 .BAT 파일을 실행 하려고합니다 .
내용 commit-build.bat
:
"msbuild.bat"
"unit-tests.bat"
"deploy.bat"
이것은 간단 해 보이지만 commit-build.bat
목록의 첫 번째 항목 만 실행합니다 ( msbuild.bat
).
문제없이 각 파일을 개별적으로 실행했습니다.
commit-build.bat
빌드 프로세스의 일부로 다른 .BAT 파일을 실행 하려고합니다 .
내용 commit-build.bat
:
"msbuild.bat"
"unit-tests.bat"
"deploy.bat"
이것은 간단 해 보이지만 commit-build.bat
목록의 첫 번째 항목 만 실행합니다 ( msbuild.bat
).
문제없이 각 파일을 개별적으로 실행했습니다.
답변:
사용하다:
call msbuild.bat
call unit-tests.bat
call deploy.bat
CALL을 사용하지 않으면 현재 배치 파일이 중지되고 호출 된 배치 파일이 실행되기 시작합니다. 초기 MS-DOS 시절로 거슬러 올라가는 독특한 행동입니다.
다른 모든 답변은 정확합니다. 전화를 사용하십시오. 예를 들면 다음과 같습니다.
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 1
NT4 / 2000 / XP보다 오래된 Windows를 사용하는 경우 모든 오류 수준 1 이상을 포착하십시오.
배치 파일의 흐름을 제어하려면 goto :-(
if errorlevel 2 goto label2
if errorlevel 1 goto label1
...
:label1
...
:label2
...
다른 사람들이 지적했듯이 배치 파일을 대체하는 빌드 시스템을 살펴보십시오.
errorlevel
명령 예제 (cmd를 콘솔에서) 윈도우 10 나에게 문제를했다. 명령을 간단히로 수정했습니다 if errorlevel neq echo Houston We have a Problem!
. 내 일괄 처리 프로세스에는 아무런 문제가 없었으며 대부분 정상적으로 완료되었지만 전화 문의 후이 명령을 사용한 모든 단계에서 "현재는 예상치 못한 결과가 발생했습니다." 그들은 같지 않음 구문을 변경되었을 수 있습니다 생각, 나는 시도 !=
도 <>
하지만 새로운 구문은 동일한 "이 시점에서 예상하지"오류가 있었다. 내가 뭘 잘못하고 있니?
여러 명령 프롬프트를 열려면
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.
start "Window title" /wait cmd /k call something.bat
순차적으로 실행하기 위해 사용 하기를 원할 것입니다.
start "Window title" /wait cmd /c something.bat
, cmd /c
완료되면 창을 닫는 위치 )
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
올바른 인용으로 (때로는 까다로울 수 있음) :
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-내부의 인수에 대해 따옴표가 두 배인 명령에 대한 인수
하나의 스크립트를 여러 개 실행하면 동일한 문제가 발생했습니다. 나는 그것이 첫 번째 스크립트에서 종료되고 있음을 깨닫지 못하고 첫 번째에서 죽게했습니다.
:: 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
exit
s를 제거하지 말고 goto :eof
대신으로 교체하십시오 . 이것은 call
@echo off :menu some commands goto menu
닫힐 때까지 연속 루프를 실행합니다. 기본적으로 당신은 ::
단지 필요하지 않습니다:
배치 스크립트를 병렬로 실행하십시오.
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