2017-06-15 188 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