使用sbt从scala运行外部进程! Windows下的运算符

时间:2013-01-16 12:51:38

标签: scala batch-file sbt external-process exitstatus

我的scala程序中有以下两行

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

program.bat看起来像这样

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

该程序实际上启动了tomcat服务器,但它对于firefox,notepad等都是一样的...所以我把它简化为notepad.exe

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

问题是代码在第一行停止并且在我关闭记事本之前不打印“已启动0”

program.bat的最后一行是

echo DONE

和DONE是在执行停止之前打印出来的最后一件事(所以我认为它不会在program.bat中停止)。

我尝试将EXIT / B 0放在program.bat脚本的末尾,但它不会改变任何内容。

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

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

1 个答案:

答案 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
}

如果您对退出代码感兴趣但希望您的Scala程序在同一时间取得进展,例如,打印调用程序的输出,您可以使用ProcessBuilder.hasExitValue找出退出代码的时间是可用的。