我正在尝试找到一个解决方案,如何实现多命令 - 与Windows cmd shell的响应交互。例如:
请注意!以上步骤仅用于描述通信方式,我不打算浏览文件系统,即实际命令可能是其他命令。
到目前为止的方法:
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做的时候的方法。
或者这完全错了?
答案 0 :(得分:1)
它是一个启动多个命令处理器的解决方案,即每个命令一个?
我问,因为保持一个命令处理器打开,很难确定命令何时被处理,除非你逐行解析输出并等到你在输出中看到提示。
使用多个处理器,即执行“cmd / c dir”,然后输入输出红色将在命令完成时关闭(并且关联的进程终止)。
当然,如果某些命令依赖于其他命令,这将无效,例如:做一个chdir并期望下一个命令在该目录中工作。