2017-06-15 86 views
0

我試圖使用getRuntime().exec()運行cmd命令。問題是,它只能如果我的命令字符串是IPCONFIG,而如果我嘗試像Java運行命令-version時間,它然後引發錯誤:java getRuntime().exec()對於運行基本cmd命令不起作用

產生java.io.IOException:不能運行程序 「時間」:CreateProcess的錯誤= 2,系統找不到指定的文件

String command = "time"; 
    Process p; 
    try { 
     p = Runtime.getRuntime().exec(command); 
     BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     String line; 
      while (true) { 
       line = r.readLine(); 
       if (line == null) { break; } 
       //System.out.println(line); 
       textField_1.setText(line); 
      } 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
+1

*系統找不到指定的文件*,所以也許不是你的道路? –

+0

「time」命令是否在你的'cmd'中工作? –

+0

因爲包含java程序的文件夾不在您的環境路徑中。將其添加到路徑中或指定java命令的絕對路徑。您可以在運行時評估一個屬性,而不是在代碼中對其進行硬編碼。 – davidxxx

回答

1

我通過使用ProcessBuilder解決了此問題。我仍然不知道爲什麼早期的代碼不適用於所有的命令。但通過使用ProcessBuilder,我能夠執行任何cmd查詢。

下面是引用代碼:

String command_ping = "ping " + host_name; 

      try { 

       ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", command_ping); 
       builder.redirectErrorStream(true); 
       Process p = builder.start(); 

       BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream())); 
       StringBuffer buffer = new StringBuffer(); 
       String line = ""; 
       while (true) 
       { 

        buffer.append(line).append("\n"); 
        line = r.readLine(); 
        if (line == null) { break; } 
       } 
       message_ping= buffer.toString(); 
       p.waitFor(); 
       r.close(); 

      } 

      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 

      catch (InterruptedException e) 
      { 
       e.printStackTrace(); 
      } 
+1

在shell中,您可以使用where.exe來確定什麼是內部命令和什麼是外部命令。 ping.exe是外部的,所以你真的不應該使用shell來執行它,特別是如果'host_name'字符串來自用戶輸入或不可信源。它很容易被利用。 – eryksun

+0

這是相當豐富!將糾正它,謝謝! – Pravar