2017-03-24 30 views
0

我有以下代碼:如何從java代碼中獲取控制檯命令的結果?

ProcessBuilder pb = new ProcessBuilder("dir"); // or cat in linux 
Process p = pb.start(); 
p.waitFor(); 
String result = IOUtils.toString(p.getInputStream(), "UTF-8"); 
System.out.println(result); 

它拋出

java.io.IOException: Cannot run program "dir": CreateProcess error=2, The system cannot find the file specified 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048) ~[na:1.8.0_111] 

我明白,我可以寫這樣的事:

ProcessBuilder pb = new ProcessBuilder("test.bat"); 

和內部test.bat你可以寫

dir 

但它返回:

D:\nsd-rest>dir 
Volume in drive D is SECOND 
Volume Serial Number is CE52-8896 

Directory of D:\nsd-rest 

03/24/17 15:53 <DIR>   . 
03/24/17 15:53 <DIR>   .. 
03/24/17 12:00    249 .gitignore 
03/24/17 16:54 <DIR>   .idea 
03/24/17 15:01 <DIR>   .mvn 
03/24/17 12:00    7,058 mvnw 
03/24/17 12:00    5,006 mvnw.cmd 
03/24/17 15:53    6,265 nsd-rest.iml 
03/24/17 15:52    1,993 pom.xml 
03/24/17 15:01 <DIR>   src 
03/24/17 15:19 <DIR>   target 
03/24/17 16:52     3 test.bat 
       6 File(s)   20,574 bytes 
       6 Dir(s) 587,412,844,544 bytes free 

D:\nsd-rest>dir 

是多餘的。

當我調用批處理文件,我覺得我做一些不正確。

你能提供正確的解決方案?

P.S.而不是dir可以是任何可執行文件。

+0

只是一個想法,爪哇可能無法訪問相同的環境變量作爲命令提示符。 (例如%PATH%) – CraigR8806

+0

@ CraigR8806有沒有辦法將dir添加到路徑? – gstackoverflow

+0

進程生成器的命令中的第一個參數被視爲可執行文件,從我所看到的情況來看,該規則沒有例外。你真正想要的是執行命令行進程,並將「dir」作爲第一個參數傳遞給該進程。 –

回答

1

有沒有dir可執行實際 - 例如在窗口的任何位置都找不到dir.exe。這是僞命令,僅存在於cmd.exe可執行上下文中。

如果你想獲得「目錄」輸出 - 你可以簡單地運行cmd.exe /c dir

也有錯誤在你的程序:

p.waitFor(); 
String result = IOUtils.toString(p.getInputStream(), "UTF-8"); 

如果程序的輸出是足夠大,將不適合輸出緩衝區,p.waitFor()永遠不會結束 - 因爲緩衝區溢出並且沒有人正在讀取它。我建議交換這些行(或者甚至更好 - 閱讀有關進程間IO的幾篇文章,這與所有不相關的東西都只與java世界有關)。

+1

這當然意味着它只能在Windows系統上運行。 –

+1

我永遠不會直接運行'dir',而是通過File.list()或類似的東西迭代,但這不是原來的問題。 –

+0

java.io.IOException:無法運行程序「cmd.exe/c dir」:CreateProcess error = 2,系統找不到指定的文件 – gstackoverflow

相關問題