实现Windows cmd通信的方法 - 多个命令

时间:2013-06-12 08:58:41

标签: java windows cmd

我正在尝试找到一个解决方案,如何实现多命令 - 与Windows cmd shell的响应交互。例如:

  1. 启动cmd shell
  2. “DIR”
  3. 等待并处理输入
  4. 根据输入内容执行新命令
  5. 等待并处理输入
  6. 请注意!以上步骤仅用于描述通信方式,我不打算浏览文件系统,即实际命令可能是其他命令。

    到目前为止的方法:

    try {            
    
            Runtime rt = Runtime.getRuntime();
    
            p = rt.exec("cmd");
            error = p.getErrorStream();
            input = p.getInputStream();
            output = new PrintStream(p.getOutputStream());            
    
            StreamGobbler errGobbler = new StreamGobbler(error, "ERROR");
            StreamGobbler inGobbler  = new StreamGobbler(input, "INPUT");
    
            errGobbler.start();
            inGobbler.start();
    
            output.println("dir");
            output.flush();
    
            sleep(5);
    
            output.println("dir");
            output.flush();
    } catch (IOException e) {
            System.out.println(e.printStackTrace());
    }
    

    StreamGobbler类:

    class StreamGobbler extends Thread
    {
        InputStream is;
        String type;
        ArrayList<String> cmdRespArr = new ArrayList<String>();
    
        StreamGobbler(InputStream is, String type) {
            this.is  = is;
            this.type = type;
    }
    
    public void run() {
    
        try  {
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader bf = new BufferedReader(isr);
            String line = null;
            while ( ( line = bf.readLine() ) != null ) {
                cmdRespArr.add(line);
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
    

    }

    在这个例子中,run方法中的while循环永远不会在发出的命令之间返回(这不是问题的一部分)。

    那么,方法是让while方法将行读取添加到集合或其他容器中,然后监视那个指示cmd shell已准备好输入的内容(这反过来表明所有可用的已读取上一个命令的输入)。然后点开下一个命令?

    在上面的示例中,此指示将摆脱睡眠调用,此时此调用仅用于调试目的。

    我有一个模糊的记忆,这是用Python做的时候的方法。

    或者这完全错了?

1 个答案:

答案 0 :(得分:1)

它是一个启动多个命令处理器的解决方案,即每个命令一个?

我问,因为保持一个命令处理器打开,很难确定命令何时被处理,除非你逐行解析输出并等到你在输出中看到提示。

使用多个处理器,即执行“cmd / c dir”,然后输入输出红色将在命令完成时关闭(并且关联的进程终止)。

当然,如果某些命令依赖于其他命令,这将无效,例如:做一个chdir并期望下一个命令在该目录中工作。