Как выполнить несколько команд по порядку в процессе Java CMD - PullRequest
0 голосов
/ 25 июня 2019

У меня есть метод, который запускает с cmd по Process

public void startCmd(){
  try {
       Process p = Runtime.getRuntime().exec("cmd");
       BufferedReader stdInput = new BufferedReader(newInputStreamReader(p.getInputStream()));
        while ((s = stdInput.readLine()) != null)
           System.out.println(s);
     } catch (IOException e) {
       e.printStackTrace();
   }
}

Моя задача - создать способ передачи команды и, основываясь на ответе, передать другую команду.Например:

foo
 result: bar, baz

, если результат baz, выполнить A, и если A возвращает C выполнить D в том же процессе, мне нужно сделать все это вJava, результат всей операции будет обработан далее по конвейеру.

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Это, вероятно, доступно где-то в качестве инструмента.

Ваш подход несколько указывает в правильном направлении, но вы очень далеки от достижения своей цели.

Прежде чем вы начнете думать о структуре, я предлагаю вам посмотреть, какправильно выполнить одно внешнее приложение.

В современной Java для этого предлагается использовать ProcessBuilder.Смотрите пример кода здесь: https://www.mkyong.com/java/java-processbuilder-examples/

Вы найдете, например, полный пример для вызова ping из Java и чтения вывода.

Когда вы освоите это, вам нужно связать результаты с вашей конфигурацией.Конфигурация должна быть прочитана в древовидную структуру, где вы переходите к следующему узлу через условия возврата, которые вы упомянули.Эта часть может на самом деле довольно легко, если все сделано хорошо.

0 голосов
/ 25 июня 2019

Вы, вероятно, хотите иметь карту, которая содержит ваш результат и некоторое представление действий, которые вы хотите выполнить, если получите такой результат.

Тогда вы просто делаете следующее:

  1. Вы запускаете свою команду
  2. Вы получите результат своей команды
  3. Вы ищите, что делать в зависимости от результата

и так далее ...

Итак, для вашего примера:

Map<UnqiueResult, Command> registry = new HashMap<>();
registry.add(UniqueResult.BAZ, new Command(A));
registry.add(UniqueResult.C, new Command(D));

Если вам также необходимо определить, кем был исполнитель для этого результата, добавьте метод для определения ключа для карты реестра.


Edit:

Если вы хотите сделать то же самое, вы должны использовать Writer в выходном потоке. Смотрите ссылку, которую я прикрепил.

(Таким образом, вам может не потребоваться делать это, если вы рассматриваете каждый шаг как независимый процесс. В этом случае ваш код должен знать контекст, но это может быть частью определения вашей команды, как упоминалось ранее.)

Если ваш первый процесс имеет результат Y / N, Вы можете просто начать следующий процесс в зависимости от результата.

Если у вас есть дополнительные требования, почему это должен быть один процесс, добавьте их к своему вопросу)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...