我如何使用 Scala Process / ProcessBuilder 重定向输出*和*设置 CWD 和 ENV?

How I redirect output *and* set the CWD & ENV using Scala Process / ProcessBuilder?

假设我有一个命令需要从 Scala 运行:

program -i inputFile

我可以调用它并使用 Scala 中的文件捕获输出:

val command = Seq("program", "-i", "inputFile")
val status = (command #> new File("capturedOutput")).!

但是我还需要设置环境和当前工作目录。 这有效:

val env = "KEY" -> "value"
val dir = new File("desiredWorkingDir")
val status = Process(command, dir, env).!

但是我不知道如何把它们放在一起,就是在我的环境中设置env,运行某个目录下的程序,捕获文件中的输出。我该怎么做?

您需要使用中级 ProcessBuilder 而不是您最初尝试的 DSL。此外,用于映射输出的 ProcessLogger class。所以,

val pb: ProcessBuilder = Process(command, dir, env)
val runningCommand = pb.run(ProcessLogger(new File("capturedOutput")))

然后等待它完成。也可以提供stream writer等

这是对 @bob-dalgleish 回答的扩展,前提是我接受了。我有一个问题,ProcessLogger 正在捕获大部分但不是 all 的输出。 如果我在获取进程的 exitValue 后关闭 processLogger,我会得到所有输出。这是完整代码:

val outputFilename = "capturedOutput-" + timestamp + ".txt"
val outputPath = dirForOutputFile + "/" + outputFilename

var env = "Key" -> "Value"
val dir: File = new File("desiredWorkingDir")
val command = Seq("program", "-i", "inputFile")

val pb: ProcessBuilder = Process(command, dir, env)
val processLogger = new FileProcessLogger(new File(outputPath))
val runningCommand = pb.run(processLogger)
val status: Int = runningCommand.exitValue()
processLogger.close()