我如何使用 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()
假设我有一个命令需要从 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()