2011-06-22 35 views
0

我正在爲命令行應用程序製作前端。它有一個很長的命令行是這個東西simliar:帶有長參數的java runtime.getRuntime.exec(cmd)

public String liveShellCommand(){ 

    String cmd="command mode --parameter arg --parameter2 arg2 --parameter3 arg3"; 

    Runtime run = Runtime.getRuntime() ; 
    Process pr ; 
    try { 
     log.progress("sending command: " +cmd);  
     pr = run.exec(cmd); 
     pr.waitFor() ; 

一切似乎工作,直到我添加了「模式」切換到它。 「模式」開關從命令行執行。我已經嘗試了幾個組合將參數拆分成不執行的數組。我認爲這與「模式」沒有 - 在它前面有關係,而且它沒有 - 在它前面。

我在做什麼錯?

編輯:我忘了提及,我能看到的是:調試器停在不可編譯的源代碼上。我正在使用netbeans,它似乎沒有打印出堆棧跟蹤。它在run.exec(cmd)上停止。 java有什麼問題嗎?

我能夠使用的ProcessBuilder爲了不只是簡單的故障運行...

它解析「命令」就好了,但是當我add「命令模式」

java.io.IOException: Cannot run program "command mode": java.io.IOException: error=2, No such file or directory 

所以我猜不能解析。

+1

的Java不應該關心如果您運行的命令有 - 在它的參數或不前 - 它只是在執行命令shell指定它。難道在你的環境中有一些「命令」需要這樣的東西,因爲java運行它的shell的方式沒有被引入? – devyndraen

+0

它確實..當我嘗試「gksudo myCommand參數」時,我學到了這一點。它將每個空間都包裝在自己的引用中。 gksudo例子顯示爲3個單獨的命令。 exec不會在系統上運行命令嗎? – AdamOutler

+1

不完全。我不確定,所以如果我錯了,不要把我的評論標記下來,但是也許試着用\ – iAndr0idOs

回答

6

+1將參數作爲數組發送。

以字符串形式發送所有內容可能適用於某些系統,但在其他系統上可能會失敗。

Process start = Runtime.getRuntime().exec(new String[] 
{ "java", "-version" }); 
BufferedReader r = new BufferedReader(
    new InputStreamReader(start.getErrorStream())); 
String line = null; 
while ((line = r.readLine()) != null) 
{ 
    System.out.println(line); 
} 

我知道你說你試圖通過發送參數作爲一個字符串數組沒有成功,但被您接收不同類型的錯誤?如果其他程序有日誌,你可能想看看發生了什麼問題。你可以編寫一個簡單的腳本來輸出它被調用的參數來測試實際發生的事情。

+0

我還沒有嘗試使用進程生成器,但它與exec尾隨,因爲它將模式視爲另一個命令。 – AdamOutler

+0

這不起作用:( – AdamOutler

+0

Process.exec在這個失敗。ProcessBuilder的工作。我結束了使用一個列表,這是一個數組更容易。 – AdamOutler

0

Array是答案。由於命令的複雜性,我也使用了ArrayList。無論如何...定義arraylist,添加命令,轉換爲數組,顯示數組,發送命令..一切運作良好。每個參數必須在它自己的數組中。

List<String> list = new ArrayList<>(); 
    list.add("command"); 
    list.add("param"); 
    String[] command = (String[]) list.toArray(new String[0]); 
    log.progress (list); 
    run.exec (command); 
0

使用的ProcessBuilder並把它傳遞一個String []

 String[] cmmm = {arg3,arg4,arg5, arg6,arg7 }; 
    ProcessBuilder pb = new ProcessBuilder(cmmm); 
    pb.directory(new File(tDir)); 
    Process p = pb.start(); 
相關問題