stasuss
@stasuss
быдлокодер со стажем

Как читать с консольного окна, если оно не выводит ничего в stdout?

Вопрос по C# WinForms (на всякий случай)

Полдня вожусь с запуском из GUI программы консольного приложения, так что бы получать текст, выводимый построчно.
С помощью Process запускаю процесс, вешаю хендлеры на DataRecieved.
Полдня не мог понять почему ничего не получаю в ответ, сейчас попробовал со стандартным ipconfig и О ЧУДО!
Сделал вывод что прога, которая мне нужна, выводит текст в консоль нестандартно как то, вроде от автора слышал про printf, но не уверен.
Как быть? Мне очень нужно парсить то что программа будет выводить во время работы)
  • Вопрос задан
  • 273 просмотра
Пригласить эксперта
Ответы на вопрос 3
newross
@newross
Product owner
DLL-injection и в путь, парсить память консольной проги.
Ответ написан
AxisPod
@AxisPod
А куда по вашему printf выводит? Может в stderr выводит?
Ответ написан
@nuclearthinking
Ковыряясь в одном интересном приложении натыкался на что то что возможно вам подойдёт

метод выполняет консольную команду
public static int runProcess(File workDir, String... command) throws Exception {
        ProcessBuilder pb = new ProcessBuilder(command);
        pb.directory(workDir);
        pb.environment().put("JAVA_HOME", System.getProperty("java.home"));
        if(!pb.environment().containsKey("MAVEN_OPTS")) {
            pb.environment().put("MAVEN_OPTS", "-Xmx1024M");
        }

        Process ps = pb.start();
        (new Thread(new Builder.StreamRedirector(ps.getInputStream(), System.out))).start();
        (new Thread(new Builder.StreamRedirector(ps.getErrorStream(), System.err))).start();
        int status = ps.waitFor();
        if(status != 0) {
            throw new RuntimeException("Error running command, return status !=0: " + Arrays.toString(command));
        } else {
            return status;
        }
    }


метод StreamRedirector использующийся в предыдущем методе
private static class StreamRedirector implements Runnable {
        private final InputStream in;
        private final PrintStream out;

        public void run() {
            BufferedReader br = new BufferedReader(new InputStreamReader(this.in));

            try {
                String ex;
                while((ex = br.readLine()) != null) {
                    this.out.println(ex);
                }

            } catch (IOException var3) {
                throw Throwables.propagate(var3);
            }
        }

        @ConstructorProperties({"in", "out"})
        public StreamRedirector(InputStream in, PrintStream out) {
            this.in = in;
            this.out = out;
        }
    }


попробуйте исследовать библиотеки которые используются данным методом
боюсь что готовое решение я вам предоставить не смогу, ещё очень слабо разбираюсь в Java
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы