Запуск внешнего процесса из 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", пока я не закрою блокнот
Последняя строка программы.bat
echo DONE
и DONE - это последнее, что распечатывается до того, как выполнение останавливается (поэтому я предполагаю, что оно не останавливается внутри program.bat).
Я попытался поместить EXIT /B 0 в конец моего скрипта program.bat, но это ничего не меняет.
Я слышал, что он отлично работает под Linux (конечно, с помощью program.sh).
Любые предложения, как ДЕЙСТВИТЕЛЬНО отсоединить блокнот от program.bat и вернуть 0?
1 ответ
Такое поведение следует ожидать, потому что !
Оператор возвращает код завершения вызванной программы - это означает, что программа должна завершиться до того, как код возврата может быть возвращен. Приведу пример из 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
чтобы узнать, когда код выхода доступен.