Java Runtime.getRunTime()。exec(CMD)不支持pipe道

我试图编写一个程序,将显示并能够使用JFrame窗口更新您的IP地址设置。 我正在看纯粹在Windows上运行,所以我试图能够使用netsh Windows命令来检索/设置的细节。

windows命令: netsh interface ip show config name="Local Area Connection" | Find "IP" netsh interface ip show config name="Local Area Connection" | Find "IP"返回正是我想要的,但是我写的代码不会通过pipe道工作,它只会在我写入“本地连接”部分时才起作用。

有什么方法可以使用pipe道function来只返回IP地址? 我读过,你可以传递行作为string数组,即string[] cmd = netsh ……..

 package ipchanger; import java.io.BufferedReader; import java.io.InputStreamReader; public class test { private String CMD; public void executecommand(String CMD) { this.CMD = CMD; try { // Run whatever string we pass in as the command Process process = Runtime.getRuntime().exec(CMD); // Get input streams BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream())); BufferedReader stdError = new BufferedReader(new InputStreamReader(process.getErrorStream())); // Read command standard output String s; System.out.println("Standard output: "); while ((s = stdInput.readLine()) != null) { System.out.println(s); } // Read command errors System.out.println("Standard error: "); while ((s = stdError.readLine()) != null) { System.out.println(s); } } catch (Exception e) { e.printStackTrace(System.err); } } public test() { String FINDIP = "netsh interface ip show config name=\"Local Area Connection\" | Find \"IP\""; //System.out.println(FINDIP); executecommand(FINDIP); } public static void main(String[] args) { new test(); } } 

以为你们可以帮忙。

幸运的是,有一种方法可以运行包含管道的命令。 该命令必须以cmd /C作为前缀。 例如:

 public static void main(String[] args) throws Exception { String command = "cmd /C netstat -ano | find \"3306\""; Process process = Runtime.getRuntime().exec(command); process.waitFor(); if (process.exitValue() == 0) { Scanner sc = new Scanner(process.getInputStream(), "IBM850"); sc.useDelimiter("\\A"); if (sc.hasNext()) { System.out.print(sc.next()); } sc.close(); } else { Scanner sc = new Scanner(process.getErrorStream(), "IBM850"); sc.useDelimiter("\\A"); if (sc.hasNext()) { System.err.print(sc.next()); } sc.close(); } process.destroy(); } 

笔记

  • Windows的控制台使用IBM850编码。 请参阅java控制台输出的默认字符编码
  • 看到愚蠢的扫描仪技巧… for useDelimiter("\\A")