我正在尝试找到一种解决方案,如何实现与 Windows cmd shell 的多命令 - 响应交互。例子:
- 启动 cmd 外壳
- “目录”
- 等待并处理输入
- 根据输入内容执行新命令
- 等待并处理输入
- 等等
请注意!上面的步骤只是描述了通信的方式,我无意浏览文件系统,即实际的命令可能是别的东西。
到目前为止的方法:
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 做的方法。
或者这是完全错误的?