我正在尝试从我的java应用程序运行一个* .bat文件(它能够运行多个命令并逐个检索输出)。 我的目的是发送一个命令,读取输出使用此输出作为第二个命令并再次检索输出。
为了实现这一点,通过Runtime.getRuntime()。exec我传递了多个命令作为PrintWriter的输入。问题是,在完成所有步骤之后,我只能通过缓冲区读取* .bat的输出,但我的目的是运行一个命令获取输出并操纵此输出以发送第二个命令。
不幸的是没有用。对此有何决议?..
我有想法通过此链接(How to execute cmd commands via Java)向Runtime.getRuntime()。exec发送多个命令
以下是我从上面的链接
获得的相同代码String[] command =
{
"cmd",
};
Process p = Runtime.getRuntime().exec(command);
new Thread(new SyncPipe(p.getErrorStream(), System.err)).start();
new Thread(new SyncPipe(p.getInputStream(), System.out)).start();
PrintWriter stdin = new PrintWriter(p.getOutputStream());
stdin.println("dir c:\\ /A /Q");
// write any other commands you want here
stdin.close();
int returnCode = p.waitFor();
System.out.println("Return code = " + returnCode);
class SyncPipe implements Runnable
{
public SyncPipe(InputStream istrm, OutputStream ostrm) {
istrm_ = istrm;
ostrm_ = ostrm;
}
public void run() {
try
{
final byte[] buffer = new byte[1024];
for (int length = 0; (length = istrm_.read(buffer)) != -1; )
{
ostrm_.write(buffer, 0, length);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
private final OutputStream ostrm_;
private final InputStream istrm_;
}
答案 0 :(得分:1)
在你的情况下,我不会使用Threads,你想要一个顺序执行路径。
答案 1 :(得分:1)
实际上,我强烈建议你使用类似于期望的java库来做这种事情,而不是试图重新发明轮子。
只是因为有几件事需要处理,例如请求之间的超时,等待输出返回等等。
看一下这些库
特别是,我在我的项目中使用expectj并且效果很好(虽然我认为expect4j更受欢迎)
使用expectj,您的代码将如下所示(来自http://expectj.sourceforge.net/)
// Create a new ExpectJ object with a timeout of 5s
ExpectJ expectinator = new ExpectJ(5);
// Fork the process
Spawn shell = expectinator.spawn("/bin/sh");
// Talk to it
shell.send("echo Chunder\n");
shell.expect("Chunder");
shell.send("exit\n");
shell.expectClose();
答案 2 :(得分:0)
您可以使用管道将一个命令的输出重定向到bat文件本身的其他命令。 对不起,我没有注意到你想先操作输出。 因此,不是使用bat文件,而是使用exec从java运行bat文件中的命令,获取输出,并使用输出来执行下一个命令。