使用Java完全重定向CMD.exe进程的输入/输出/错误流

时间:2010-11-29 06:12:53

标签: java input cmd redirect

我对这个项目的目标是使用Java获得远程命令提示符。使用TCP / IP套接字,我的目标是在一台计算机上运行命令提示过程,并将所有控件虚拟传输到另一端。我立刻偶然发现了Runtime.getRuntime()。exec()和Process对象等。我已经解决了我的问题。使用我的远程命令提示符,我可以运行单个命令,收集输出,然后将其发送回另一端。问题是,我似乎只能为每个命令提示符实例运行一个命令。这不会做(我需要更改目录,然后运行命令等)。我已经从这种情况中剥离了所有套接字/网络编程以向您展示(并为我创建一个更简单的测试环境)。

import java.io.*;


public class testingProgram {

 public static void main(String[] args) {

  Runtime rt = Runtime.getRuntime();
  StringBuilder inputMessage = new StringBuilder();
  String resultData;
  try {

   Process pr = rt.exec("cmd.exe /c net user");
   BufferedReader processInput = new BufferedReader(new InputStreamReader(pr.getInputStream()));
   BufferedReader errorProcessInput = new BufferedReader(new InputStreamReader(pr.getErrorStream()));
   PrintWriter processOut = new PrintWriter(pr.getOutputStream());
   while( (resultData = processInput.readLine()) != null ) {
      inputMessage.append(resultData + "\n");
   }
   resultData = inputMessage.toString();
   System.out.print(resultData);
  } catch(IOException e) {

  } //catch(InterruptedException e) {

  //}
 }

}

我还有很多,但这就是我的问题所在。我可以使用一个简单的变量和来自socketstream的消息自定义命令“net user”,这不是我的问题。我的问题是我需要创建一个持续的命令提示实例,保留输入/输出的所有重定向。基本上,我希望能够在“网络用户”之后发送另一个命令。

我已经收集并重定向了输出流。我希望能够做到这样的事情:

processOut.write("net user");

我希望能够使用它,让命令提示符运行命令,并保留输出(无论是来自errorStream还是inputStream)。

我还需要更多关于如何做到这一点的方向。

2 个答案:

答案 0 :(得分:1)

你应该研究多线程。你基本上想要的是一个不断运行和维护rt的线程。

像这样:

  String commandLine;
  while ((commandLine = System.in.readline()) != 'q') {
        Process pc = rt.exec(commandLine);
  }

有关多线程的进一步参考: http://download.oracle.com/javase/tutorial/essential/concurrency/procthread.html

问题是您的程序在一次通话后终止。

欢呼声

答案 1 :(得分:1)

你告诉命令解释器终止。在cmd.exe之后删除/ C.

cmd /?
Starts a new instance of the Windows command interpreter

CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]
    [[/S] [/C | /K] string]

/C      Carries out the command specified by string and then terminates
/K      Carries out the command specified by string but remains
...