2013-06-12 46 views
6

我試圖運行.bat文件並獲取輸出。我可以運行它,但我不能在Java中得到的結果:使用Java從BAT文件獲取輸出

String cmd = "cmd /c start C:\\workspace\\temp.bat"; 

Runtime r = Runtime.getRuntime(); 
Process pr = r.exec(cmd); 

BufferedReader stdInput = new BufferedReader(
    new InputStreamReader(pr.getInputStream())); 

String s ; 
while ((s = stdInput.readLine()) != null) { 
    System.out.println(s); 
} 

結果是null。不知道爲什麼我得到這個。請注意,我正在使用Windows 7.

+0

閱讀(並實現)*所有* [Runtime.exec()不會](http://www.javaworld.com/jw-12-2000/jw-1229-traps.html)的建議* 。這可能會解決問題。如果不是,它應該提供更多關於失敗原因的信息。然後忽略它引用'exec'並使用'ProcessBuilder'構建'Process'。還要將'String arg'分解爲'String [] args'來解釋其本身包含空格的參數。 –

回答

4

使用「cmd/c啓動[...]「來運行批處理文件將創建一個子流程,而不是直接運行批處理文件。

因此,您將無法訪問其輸出。 要使其工作,您應該使用:

String cmd = "C:\\workspace\\temp.bat"; 

它在Windows XP下工作。

+0

這解決了它 我有 bat文件的另一個問題包含 開始的run.bat命令 ,我需要其他的結果也 :( – Muath

+1

您可以使用** ** CALL運行主內的其他批處理文件參見[link](http://www.robvanderwoude.com/call.php)和[link](http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en- us/call.mspx?mfr = true)作爲參考。 –

3

在您致電process.waitFor()後,您需要啓動一個新線程讀取終端輸出流並將其複製到控制檯。

做這樣的事情:

String line; 
Process p = Runtime.getRuntime().exec(...); 
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
while ((line = input.readLine()) != null) { 
    System.out.println(line); 
} 
input.close(); 

更好的方法將是使用ProcessBuilder類,並嘗試寫類似:

ProcessBuilder builder = new ProcessBuilder("/bin/bash"); 
builder.redirectInput(); 
Process process = builder.start(); 

while ((line = reader.readLine()) != null) { 
    System.out.println ("Stdout: " + line); 
} 
+0

哥們我試過這個沒有工作 我得到空值而不是命令結果 – Muath

+0

在ProcessBuilder 沒有.redirectInput();方法 有什麼建議? 我使用NetBeans BTW – Muath

-1
BufferedReader stdInput = new BufferedReader(new 
InputStreamReader(pr.getErrorStream())); 

改用

BufferedReader stdInput = new BufferedReader(new 
InputStreamReader(pr.getInputStream)); 
+0

不要忽略錯誤流。爲了健壯的代碼,兩者都必須被使用。 –

+0

兩個while循環分別需要 –

+0

這實際上並不回答這個問題。 –