Запуск внешнего процесса из 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 чтобы узнать, когда код выхода доступен.

Другие вопросы по тегам