2013-05-02 136 views
1

我已經創建了一個GUI(swing),它執行一個批處理文件,該文件包含使用特定參數執行的命令提示符.exe文件。 當我手動運行批處理文件(通過雙擊它)時,一切都如預期。 問題是:命令提示符窗口未打開以顯示進度,此外,直到我退出GUI(分叉?)之前,它才真正開始工作(僅啓動)。當它開始工作時,在後臺的某處工作,只在任務管理器中看到。 只打開一個空白的命令提示符窗口。使用Runtime.getRuntime()不會打開命令提示符exec

從周圍挖一點,我已經構建的這個命令,讓我與上述相同的結果:

Runtime.getRuntime().exec("cmd.exe /c start \"Encoding\" cmd.exe /c start md \"" + Gui.outputDirField.getText() + "\\encoderOutput\" & cd \"" + Gui.outputDirField.getText() + "\\encoderOutput\" & \"" + Gui._batFile + "\" & pause"); 

能否請您協助?

很抱歉,如果這聽起來愚蠢..

+1

*「有什麼想法?」*爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 – 2013-05-02 14:15:38

+1

考慮'ProcessBuilder',如圖所示(http://stackoverflow.com/a/9832473/230513)。 – trashgod 2013-05-02 17:19:09

回答

2

這種方式爲我工作:

new Thread() { 
@Override public void run() { 
try {  
Runtime.getRuntime().exec("cmd.exe /c start " + Gui._batFile); 
} catch (IOException e1) { 
e1.printStackTrace(); 
} 
} 
}.run(); 
0

請問您的bat文件requiere用戶交互,你爲什麼把暫停對你的命令?如果是這樣,Runtime.exec只是運行沒有窗口的文件,爲什麼你想要一個窗口? >可以從exec獲得一個Process對象,從這個對象中你可以得到一個InputStream(如果需要的話,還可以是一個OutputStream),這樣你就可以打印輸出或者與進程交互了。

+0

我想暫停在命令提示符下查看結果(在完成後不要關閉)。輸入流是否實時更新?或者在這個過程結束之後? – Mark 2013-05-02 15:06:46

+0

好的,現在很清楚。您可能必須實現與InputStream和OutputStream的交互......問題是,用您的命令打開一個新窗口Process,因此Java代碼無法等待批處理文件。除非有其他方法來處理啓動命令,否則我認爲讓Java代碼等待批處理程序終止會讓您需要在流中實現一些邏輯。 – Martin 2013-05-03 15:10:09

+0

如果你想要從Java與流程交互的方式,下面是一個示例代碼:http://www.rgagnon.com/javadetails/java-0014.html – Martin 2013-05-03 15:11:43

1

trashgod可能將要發生什麼。我們遇到了帶有空格的路徑問題。這是從release notes for jre 7u21

更改的Runtime.exec

在Windows平臺上,命令字符串解碼指定Runtime.exec(String)Runtime.exec(String,String[])Runtime.exec(String,String[],File)方法,已得到改進,更加緊密地遵循規範。這可能會導致使用一個或多個這些方法的程序名稱中包含空格的命令的應用程序出現問題,或者使用未正確引用的命令調用這些方法。

例如,Runtime.getRuntime().exec("C:\\My Programs\\foo.exe bar")是嘗試啓動程序"C:\\My",其參數爲"Programs\\foo.exe""bar"。此命令可能會失敗,並指示"C:\My"無法找到。

示例Runtime.getRuntime().exec("\"C:\\My Programs\\foo.exe\" bar")是嘗試啓動程序"\"C:\\My"。該命令將失敗並顯示一個異常,表明該程序有嵌入式報價。

需要使用程序名稱中的空格啓動程序的應用程序應考慮使用允許在數組中指定命令和參數的Runtime.exec變體。

或者,自從JDK 5.0使用java.lang.ProcessBuilder以來,創建操作系統進程的首選方法。 ProcessBuilder類具有更完整的API,用於設置過程的環境,工作目錄和重定向流。