0

私のscalaプログラムには次の2行があります

val success:Int = ("d:\\program.bat" !)
println("started "+success)

program.batは次のようになります

@echo off
start "" "d:\notepad.exe"
echo DONE

プログラムは実際にTomcatサーバーを起動しますが、Firefox、メモ帳などでも同じです。したがって、これをnotepad.exeに簡略化しました。

メモ帳を起動して「started0」を見たいのですが。

問題は、コードが最初の行で停止し、メモ帳を閉じるまで「started0」を出力しないことです。

program.batの最後の行は

echo DONE

DONEは、実行が停止する前に最後に出力されるものです(したがって、program.bat内で停止しないと思います)。

program.batスクリプトの最後にEXIT/B 0を入れてみましたが、何も変わりません。

Linuxでは正常に動作すると聞きました(もちろんprogram.shを使用)。

メモ帳をprogram.batから本当に切り離して0を返す方法についての提案はありますか?

4

1 に答える 1

3

オペレーターは呼び出されたプログラムの終了コードを返すため、この動作は予期されるものです。これ!は、終了コードを返す前にプログラムを終了する必要があることを意味します。processdocsからの例の引用:

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 に答える