Java的调用Runtime.getRuntime()。EXEC(CMD)不支持管道(Java Ru

2019-07-02 12:10发布

我试图写一个程序,将显示并可以更新使用一个JFrame窗口中的IP地址设置。 我期待在Windows上运行此纯属所以我试图能够使用netsh命令窗口检索/集的详细信息。

Windows命令: netsh interface ip show config name="Local Area Connection" | Find "IP" netsh interface ip show config name="Local Area Connection" | Find "IP"返回正是我想要的它,但是我写的代码不会过去管工作,如果我写上去的“本地连接”部分将只工作。

有没有使用管道功能,能够返回而言,就要在IP地址的方法吗? 我看,可以传递线作为一个字符串数组,即字符串[] 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();
}
}

以为你们也许能提供帮助。

Answer 1:

幸运的是,有一种方法来运行包含管道的命令。 该命令必须与前缀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();
}

笔记

  • 窗口的控制台使用IBM850编码。 请参阅用于Java控制台输出的默认字符编码
  • 愚蠢的扫描仪的技巧......useDelimiter("\\A")


文章来源: Java Runtime.getRunTime().exec(CMD) not supporting pipes