2

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

  1. 启动 cmd 外壳
  2. “目录”
  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 已准备好输入(这反过来又表明来自先前的所有可用输入命令已被读取)。然后触发下一个命令?

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

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

或者这是完全错误的?

4

1 回答 1

1

启动多个命令处理器(即每个命令一个)是否是一种解决方案?

我之所以这样问,是因为在打开一个命令处理器的情况下,很难确定何时处理了一个命令,除非您逐行解析输出并等到您在输出中看到提示。

对于多个处理器,即执行“cmd /c dir”然后输入输出redirs 将在命令完成时关闭(并且相关进程终止)。

当然,如果某些命令依赖于其他命令,例如执行 chdir 并期望下一个命令在该目录中工作,这将不起作用。

于 2013-06-12T11:01:42.127 回答