2013-01-16 51 views
0

下,運營商,我有以下兩條線在我的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」,直到我關閉記事本

的program.bat的最後一行是

echo DONE 

和DONE是在執行停止之前打印出最後一件東西(所以我假設它不會停止在program.bat中)。

我試着把EXIT/B 0放在我的program.bat腳本的末尾,但它沒有改變任何東西。

我聽說它在linux下正常工作(當然使用program.sh)。

任何建議如何真正從program.bat分離記事本並返回0?

回答

3

由於!運算符返回被調用程序的退出代碼 - 這意味着程序必須在返回退出代碼之前終止,因此會出現此行爲。報價從process docs一個例子:

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 
} 

如果你有興趣的退出代碼,但想你的斯卡拉計劃取得進展的平均時間,例如,打印調用程序的輸出,你可以使用ProcessBuilder.hasExitValue找出退出代碼何時可用。

+0

感謝您的回答!這是一個有用的知識。但我實際上想要實現的目標是讓program.bat「fire and forget」記事本而不是scala程序「fire and forget」program.bat。那麼,我是否正確地認爲program.bat不會終止(儘管它會打印出DONE),直到它開始的進程終止爲止?我可以強迫它終止,而不是等待記事本終止? – misiek

+0

我明白了,我誤解了你的帖子。如果你在shell上運行'program.bat',你會發現它忘記記事本。但是,一旦所有子進程終止,由Scala啓動的進程只會終止,其中包括已被觸發和忘記的記事本進程。 –