Запуск команды из Java дает пустой вывод

1

Мне нужно запустить команду comand с помощью java, но она работает нормально в терминале, поскольку

svn list http://192.168.0.19/svn/cc/Branch/Jobs/tt/jobs/ --username prasadh --password prasadh2k> output.txt

Но при запуске одного и того же через построитель процессов он возвращает пустой результат.

Мой код:

    ProcessBuilder pb = new ProcessBuilder("cmd", "C:\\Users\\dev112\\output", "svn", "list", "http://192.168.0.19/svn/cadgraf/Branch/Jobs/T0003SATHYABAMAT/Completedjobs", "--username", "prasadh", "--password", "prasadh2k", ">", "output.txt");
    pb.redirectErrorStream(true);
    try {
        Process p = pb.start();
        new Thread(new InputConsumerforImageMagick.InputConsumer(p.getInputStream())).start();
        try {
            System.err.println("Exited with: " + p.getErrorStream());
        } catch (Exception ex) {
            Logger.getLogger(AddImage.class.getName()).log(Level.SEVERE, null, ex);
        }
    } catch (IOException ex) {
        Logger.getLogger(AddImage.class.getName()).log(Level.SEVERE, null, ex);
    }
  • 0
    Вы хотели удалить /c из "команды cmd / C для запуска"? Я предлагаю вам попробовать запустить всю команду в командной строке с помощью команды cmd Скорее всего, вы получаете ошибку, и, поскольку вы игнорируете поток ошибок, вы можете ' не вижу этого.
  • 1
    Нет, я пытаюсь записать вывод в текстовый файл, но он создает текстовый файл, но не записывает в него никакого значения.
Показать ещё 8 комментариев
Теги:
command-line
processbuilder

3 ответа

0

Это работает для меня:

String command = "svn list http://192.168.0.19/svn/cc/Branch/Jobs/tt/jobs/ --username prasadh --password prasadh2k";
ProcessBuilder processBuilder = new ProcessBuilder(command.split());
processBuilder.redirectOutput(new File("C:/Users/dev112/output/", "output.txt"));
processBuilder.start();
  • 1
    Ошибка: java.io.IOException: Невозможно запустить программу "": ошибка CreateProcess = 87, параметр неверен на java.lang.ProcessBuilder.start (ProcessBuilder.java:1047) на java.lang.ProcessBuilder.start (ProcessBuilder.java : 1047) at org.archiveindexer.dao.RuntimeDemo.main (RuntimeDemo.java:33) Причина: java.io.IOException: ошибка CreateProcess = 87, неверный параметр в java.lang.ProcessImpl.create (собственный метод) в java.lang.ProcessImpl. <init> (ProcessImpl.java:385) в java.lang.ProcessImpl.start (ProcessImpl.java:136) в java.lang.ProcessBuilder.start (ProcessBuilder.java:1028) ... 1 больше
  • 0
    @prasath Вы только что понизили мой ответ?
0

Не проходите через cmd. Просто запустите команду напрямую:

final Path cwd = Paths.get("c:\\Users\\dev112\\output");
Files.createDirectories(cwd);
final Path outfile = cwd.resolve("output.txt");

final ProcessBuilder pb = new ProcessBuilder("svn", "list",
    "http://192.168.0.19/svn/cadgraf/Branch/Jobs/T0003SATHYABAMAT/Completedjobs",
    "--username", "prasadh", "--password", "prasadh2k");

pb.directory(cwd.toFile());
pb.redirectOutput(outfile.toFile());

final int retcode = pb.start().waitFor();

Более того, почему вы получаете стандартный вывод процесса, если вы выходите в файл? Сделайте то или другое, а не то и другое. Если вы выходите в файл, тогда прочитайте содержимое этого файла после выполнения команды.

Образец выше выдает файл; просто откройте поток к этому файлу после использования Files.newInputStream(outfile) (ну, то есть, если retcode равен 0, а если это не так, ваша команда закончилась ошибкой, что также означает, что вы должны перенаправить stderr где-нибудь, слишком)

  • 0
    Примечание: redirectOutput() доступен только с Java 7.
  • 0
    @AaronDigulla да, но и Path тоже. И это 2015 год, верно? :п
Показать ещё 6 комментариев
0

Перенаправление ввода-вывода не работает с ProcessBuilder. Вы должны либо вызвать cmd.exe с помощью

new ProcessBuilder("cmd", "/c", "svn ... > output.txt");

(т.е. вы должны вызвать cmd с двумя аргументами) или вы должны перенаправить себя, то есть вам нужно запустить фоновый поток, который считывает stdout из процесса и записывает его в output.txt. В этом случае вы должны использовать:

new ProcessBuilder("svn", "list", ...);

Первый - хрупкий, когда в аргументах есть пробелы. Поэтому я предлагаю последнее, хотя код Java намного сложнее.

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

Или с помощью Java 7 вы можете использовать pb.redirectOutput();

  • 0
    «вам нужно запустить фоновый поток, который читает stdout из процесса и записывает его в output.txt» <- а? ProcessBuilder имеет .redirectOutput() ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню