Windows 배치 파일 명령을 비동기 적으로 실행


187

내가 있다면

  • foo.exe
  • bar.exe
  • baz.exe

이전 파일이 중지 될 때까지 기다리지 않고 배치 파일에서 비동기식으로 모든 파일을 어떻게 실행합니까?

답변:


254

START명령을 사용하여 각 프로그램을 실행하면 필요한 것을 얻을 수 있습니다.

START "title" [/D path] [options] "command" [parameters]

모든 START호출은 /WAIT스위치로 실행되지 않는 한 해당 매개 변수에 제공된 명령을 실행하고 즉시 리턴합니다 .

이는 명령 줄 앱에 적용됩니다. 명령 줄이없는 앱은 어쨌든 즉시 반환되므로 모두 비동기 적으로 실행하려면을 사용하십시오 START.


괜찮 감사. 각 항목을 help주의 깊게 읽어야합니다 . :)
RichN

8
나는 다른 날이 문제에 실제로 어려움을 겪었습니다. 성능 테스트를 위해 30 개의 탐색기 창을 시작해야했습니다. 작동하지 않았고 그것을 조사하기에 충분하지 않았습니다.. 대신 그 창에서 둘러보기 시작했고 몇 시간 후에 창을 닫았을 때 다른 창이 뜹니다! 그리고 나는 도대체 무엇과 같았고, 그것을 닫았다. 4-5 개의 창과 ****의 많은 것들 후에 배치 파일이 여전히 실행 중임을 알았습니다!
조나스 B

3
: 뻔뻔한 자기 광고 : 나는 한 번에 단지 프로세스, 스레드 풀의 일종으로 기능 할 수있는 일괄 생성 stackoverflow.com/questions/672719/...
조이

4
인수를 제공해야하거나 명령 경로에 공백이 있으면 따옴표를 추가해야합니다. 이 경우 시작 콘솔 창의 제목도 제공해야합니다. start "" "[path to command]"[command args]
Pierluigi

이 기술을 수행 할 때 알 수있는 방법이 있습니까? 나는 ~ 30 사본 FILA DESTA를 시작하고 있으며 비 동기화하기를 원하지만 모두 완료되면 아이디어를 원합니다.
Doug

68

이전 답변 몇 가지를 결합하면 시도해 볼 수 있습니다. start /b cmd /c foo.exe 있습니다.

간단한 예를 들어, java / groovy / grails / gradle 버전을 인쇄하려면 배치 파일로이를 수행 할 수 있습니다.

@start /b cmd /c java -version
@start /b cmd /c gradle -version
@start /b cmd /c groovy -version
@start /b cmd /c grails -version

Process Explorer (Sysinternals)와 같은 것이 있다면 위의 명령에 따라 java 프로세스를 사용하여 몇 개의 자식 cmd.exe 프로세스가 각각 표시됩니다. 출력은 완료된 순서대로 화면에 인쇄됩니다.

start /b :  Start application without creating a new window. The
             application has ^C handling ignored. Unless the application
             enables ^C processing, ^Break is the only way to interrupt
             the application

cmd /c : Carries out the command specified by string and then terminates

13
명령이 콘솔에 에코되는 것을 방지합니다. 배치 스크립트에서, 때로는 스크립트 echo off를 실행할 때 모든 명령이 콘솔에 에코되는 것을 방지하는 시작 부분이 표시됩니다. 이것은 @비슷하지만 그 단일 명령에만 해당됩니다. 따라서 때때로을 보게 될 것 @echo off입니다.
djKianoosh

36

새 창을 시작하지 않고 start 명령을 사용하여 백그라운드 프로세스를 생성 할 수 있습니다.

start /b foo.exe

새로운 프로세스는 CTRL-C로 중단 할 수 없습니다. CTRL-BREAK를 사용하거나 창을 닫거나 작업 관리자를 통해서만 죽일 수 있습니다.


5
BREAK요즘 키보드 는 어디에 있습니까 ?
user2023370

1
@ user2023370 여전히 Pause 키에 있습니다. 특정 키가없는 대부분의 랩톱은 숨겨진 키 조합을 지원 합니다.
Gerold Broser


23

다음 줄을 사용하여 배치 파일을 만듭니다.

start foo.exe
start bar.exe
start baz.exe 

시작 명령은 3 개 명령을 비동기 적으로 실행됩니다, 그래서 새 창에서 명령을 실행합니다.


17

START 명령을 사용하십시오 .

start [programPath]

프로그램 경로에 공백이 있으면 따옴표를 추가해야합니다. 이 경우 오프닝 콘솔 창의 제목을 제공해야합니다.

start "[title]" "[program path]"

인수를 제공해야하는 경우 끝에 명령 따옴표 외부에 추가하십시오.

start "[title]" "[program path]" [list of command args]

새 콘솔 창을 열지 않으려면 / b 옵션을 사용하십시오 (이 경우 CTRL-C를 사용하여 응용 프로그램을 중단 할 수 없음)


10

세 번째 (및 잠재적으로 훨씬 쉬운) 옵션이 있습니다. 단일 프로그램의 여러 인스턴스를 스핀 업하려는 경우 Xargs 또는 GNU Parallel과 같은 Unix 스타일 명령 프로세서를 사용하면 상당히 간단한 프로세스를 만들 수 있습니다.

PPX2라는 win32 Xargs 클론이 있습니다. 이 매우 간단합니다.

예를 들어, 비디오 파일의 디렉토리를 트랜스 코딩하려면 다음 명령을 실행할 수 있습니다.

dir /b *.mpg |ppx2 -P 4 -I {} -L 1 ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4"

이것을 분리 dir /b *.mpg하고 현재 디렉토리에서 .mpg 파일 |목록을 가져 오면 연산자는이 목록을 ppx2로 파이프 한 다음 병렬로 실행할 일련의 명령을 빌드합니다. -P 4운영자가 여기에 지정한대로 한 번에 4 개 . 그만큼-L 1연산자는 한 번에는 FFmpeg에 나열 우리의 디렉토리의 한 줄을 보낼 수 ppx2을 알려줍니다.

그런 다음 명령 줄 ( ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4")을 작성하면됩니다.{} 디렉토리 목록의 각 행이 자동으로 대체됩니다.

모든 경우에 보편적으로 적용되는 것은 아니지만 위에서 설명한 배치 파일 해결 방법을 사용하는 것보다 훨씬 쉽습니다. 물론 파일 목록을 다루지 않으면 텍스트 파일이나 다른 프로그램의 내용을 pxx2의 입력으로 파이프 할 수도 있습니다.


1
최신 xargs win32 포트는 요즘 잘 작동합니다 (어쨌든 Windows 용 git에 포함 된 포트).
피터 M

유니 코드 문자가 포함 된 파일을 처리하지 못하면 예외입니다. 유니 코드 파일을 지원할 계획이 있습니까? 감사.
Gökhan Sever

@ GökhanSever 과거에는 C : \ PROGRA ~ 1 \ WINDOW ~ 3 \ MYPROG ~ 1.EXE와 같이 "짧은 이름"형식의 경로를 사용하여이 문제를 해결했습니다. 예쁘지 않지만 작동합니다.
meltform 2018 년

-1

나는 아무것도 할 수 없었습니다. 배트 스크립트를 시작하기 위해 powershell을 사용했습니다. 때로는 심지어 cmd / c를 시작해도 왜 그런지 모르겠습니다 ..start cmd / c notepad & exit

start-Process "c:\BACKUP\PRIVATE\MobaXterm_Portable\MobaXterm_Portable.bat" -WindowStyle Hidden
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.