2013-01-16 8 views
0

에서 운영자 I가sbt를 사용하여 스칼라에서 외부 프로세스를 실행 중입니다! 윈도우

val success:Int = ("d:\\program.bat" !) 
println("started "+success) 

program.bat이

@echo off 
start "" "d:\notepad.exe" 
echo DONE 

프로그램이 실제로 바람둥이 서버를 시작하지만, 파이어 폭스에 대한 모든 동일처럼 보이는 내 스칼라 프로그램에서 다음 두 줄 , 메모장 등등 ... 그래서 나는 이것을 notepad.exe로 단순화했다.

나는 메모장을 시작하고 "started 0"을보고 싶다.

이 문제는 코드가 첫 번째 줄과 나던 인쇄에 중지한다는 것입니다 내가 메모장

program.bat의 마지막 줄은

echo DONE 

이다 닫을 때까지 "0 시작"과는 DONE입니다 실행이 끝나기 전에 마지막으로 인쇄 된 것이므로 program.bat 내에서 멈추지 않을 것이라고 가정합니다.

내 program.bat 스크립트 끝에 EXIT/B 0을 넣으려고했지만 아무 것도 변경하지 않습니다.

나는 리눅스에서 잘 작동한다고 들었다 (물론 program.sh 사용).

정말로 program.bat에서 메모장을 분리하고 0을 반환하는 방법에 대한 제안이 있으십니까?

답변

3

! 연산자가 호출 된 프로그램의 종료 코드를 반환하기 때문에이 동작이 예상됩니다. 즉, 종료 코드를 반환하기 전에 프로그램을 종료해야한다는 의미입니다. process docs에서 예를 인용 : 당신이 종료 코드에 관심이 있지만 스칼라 프로그램, 예를 들어, 평균 시간에 진전을 호출 된 프로그램의 출력을 인쇄 할 경우 ProcessBuilder.hasExitValue을 사용할 수

import scala.sys.process._ 

// This uses ! to get the exit code 
def fileExists(name: String) = Seq("test", "-f", name).! == 0 

// This uses !! to get the whole result as a string 
val dirContents = "ls".!! 

// This "fire-and-forgets" the method, which can be lazily read through 
// a Stream[String] 
def sourceFilesAt(baseDir: String): Stream[String] = { 
    val cmd = Seq("find", baseDir, "-name", "*.scala", "-type", "f") 
    cmd.lines 
} 

종료 코드를 사용할 수있는시기를 확인하십시오.

+0

답해 주셔서 감사합니다! 이것은 유용한 지식입니다. 하지만 실제로 달성하기를 원하는 것은 program.bat를 "화재 및 잊어 버리기"프로그램이 아닌 "메모 및 메모"프로그램으로 만드는 것입니다. 그렇다면 program.bat가 시작한 프로세스가 종료 될 때까지 종료되지 않습니다. 강제로 종료하고 메모장 종료를 기다리지 않을 수 있습니까? – misiek

+0

나는 너의 포스트를 오해했다. 쉘에서'program.bat'을 실행하면, 메모장을 불과 잊어 버릴 것입니다. 그러나 스칼라가 시작한 프로세스는 모든 하위 프로세스가 종료 된 후에 만 ​​종료됩니다. 여기에는 실행 및 잊어 버린 메모장 프로세스가 포함됩니다. –