如何执行一系列相关的控制台命令?

时间:2013-04-18 21:52:54

标签: java process runtime.exec

我目前正在开发一个项目,客户端从服务器接收shell / console命令,并且必须执行它们。

如何让Java在shell或命令提示符下运行这些命令?我希望能够忽略平台类型 - 而不必指定shell或命令提示符 - 但如果我不能,那就没关系。

我必须能够发送相关命令的序列,而不仅仅是一个命令。这意味着shell /提示符不能在命令之间退出或关闭。

我当前的代码,如下所示,允许执行一系列程序,但这些命令必须以某种方式通过管道输入shell /命令提示符,必须从中读取输出。

ArrayList<String> comDat = new ArrayList<>();

while(true) {
    String input = con.recv();
    System.out.println("> " + input);

    if(!input.equals("EOF")) comDat.add(input); else {
        String[] s = new String[comDat.size()];
        for(int i = 0; i < comDat.size(); i++) s[i] = comDat.get(i);

        System.out.println("---Command sequence executing---");
        Process p = Runtime.getRuntime().exec(s);
        p.waitFor();

        System.out.println("---ErrorStream output---"); String line = "";
        BufferedReader errStream = new BufferedReader(new InputStreamReader(p.getErrorStream()));
        while((line = errStream.readLine()) != null) System.out.println("< " + line);

        System.out.println("\n---OutputStream output---"); line = "";
        BufferedReader outStream = new BufferedReader(new InputStreamReader(p.getInputStream()));
        while((line = errStream.readLine()) != null) System.out.println("< " + line);
    }
    Thread.sleep(200);
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

围绕dir不是外部命令但是cmd的功能的基本前提进行了回顾。

在读取进程的输出时我会避免BufferedReaders因为并非所有进程在发送输出时都使用新行(例如进度指示符),而是应该读取char for char(IMHO)。

您应该{@ 1}}而不是ProcessBuilder。它提供了更好的管理,允许您将错误流重定向到输入流,从而更容易读取输入。

Runtime#exec