Перенаправление потоков ввода / вывода / ошибок процесса CMD.exe полностью с Java - PullRequest
2 голосов
/ 29 ноября 2010

Моя цель в этом проекте состояла в том, чтобы создать удаленную командную строку в 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) {

  //}
 }

}

У меня есть намного больше, но здесь моя проблема. Я могу настроить команду «net user» с помощью простой переменной и сообщения от socketstream, так что это не моя проблема. Моя проблема заключается в том, что мне нужно создать текущий экземпляр командной строки, сохраняя все перенаправления ввода / вывода. По сути, я хотел бы иметь возможность отправить еще одну команду ПОСЛЕ «net user».

Я собрал и перенаправил поток вывода. Я хочу быть в состоянии сделать что-то вроде:

processOut.write("net user");

Я хочу иметь возможность использовать это, заставить командную строку выполнить команду и сохранить вывод (будь то из errorStream ИЛИ inputStream).

Мне просто нужно больше указаний о том, как это сделать.

Ответы [ 2 ]

1 голос
/ 07 октября 2011

Вы говорите командному интерпретатору прекратить. Удалите / C после cmd.exe.

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
...
1 голос
/ 29 ноября 2010

Вы должны посмотреть на многопоточность. То, что вы в основном хотите, это поток, который продолжает работать и поддерживать RT.

Как это:

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

Для получения дополнительной информации о многопоточности: http://download.oracle.com/javase/tutorial/essential/concurrency/procthread.html

Ваша проблема в том, что ваша программа завершает работу после одного вызова.

ура

...