0

我的 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

我想启动记事本并看到“started 0”。

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

program.bat 的最后一行是

echo DONE

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

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

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

有什么建议可以真正从 program.bat 中分离记事本并返回 0?

4

1 回答 1

3

这种行为是意料之中的,因为!操作符返回被调用程序的退出代码——这意味着程序必须在退出代码返回之前终止。引用process文档中的示例:

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来找出退出代码何时可用。

于 2013-01-16T13:29:06.273 回答