2013-01-16 50 views
0

下,运营商,我有以下两条线在我的Scala程序使用sbt从scala运行外部进程!视窗

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

program.bat看起来像这样

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

程序实际启动Tomcat服务器,但它是Firefox的都是一样的,记事本等...所以我简化了这个notepad.exe

我想开始记事本,看到“开始0”。

的问题是,代码停在第一线和犯规打​​印“开始0”,直到我关闭记事本

的program.bat的最后一行是

echo DONE 

和DONE是在执行停止之前打印出最后一件东西(所以我假设它不会停止在program.bat中)。

我试着把EXIT/B 0放在我的program.bat脚本的末尾,但它没有改变任何东西。

我听说它在linux下正常工作(当然使用program.sh)。

任何建议如何真正从program.bat分离记事本并返回0?

回答

3

由于!运算符返回被调用程序的退出代码 - 这意味着程序必须在返回退出代码之前终止,因此会出现此行为。报价从process docs一个例子:

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 
} 

如果你有兴趣的退出代码,但想你的斯卡拉计划取得进展的平均时间,例如,打印调用程序的输出,你可以使用ProcessBuilder.hasExitValue找出退出代码何时可用。

+0

感谢您的回答!这是一个有用的知识。但我实际上想要实现的目标是让program.bat“fire and forget”记事本而不是scala程序“fire and forget”program.bat。那么,我是否正确地认为program.bat不会终止(尽管它会打印出DONE),直到它开始的进程终止为止?我可以强迫它终止,而不是等待记事本终止? – misiek

+0

我明白了,我误解了你的帖子。如果你在shell上运行'program.bat',你会发现它忘记记事本。但是,一旦所有子进程终止,由Scala启动的进程只会终止,其中包括已被触发和忘记的记事本进程。 –