2015-01-23 2 views
1

мне нужно запустить ниже COMAND с помощью Java, но работает нормально в терминале, какЗапуск команды из Java производит пустой выход

список Svn 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

Не пытаюсь написать вывод в текстовом файле, но он создает текстовый файл, но не записывает в него никакого значения. –

+0

В этом случае вам, скорее всего, понадобится '/ C' –

ответ

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 да, но тогда и есть «Путь». И это 2015 год, не так ли? : p – fge

+0

final int retcode = pb.build(). waitFor(); ---> Получаем ошибку в этой строке. Я тоже пробовал это, но тот же результат –

0

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

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

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

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

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

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

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

+0

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

-1

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

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, Неправильный параметр \t в java.lang.ProcessBuilder.start (ProcessBuilder. java: 1047) \t at java.lang.ProcessBuilder.start (ProcessBuilder.java:1047) \t at org.archiveindexer.dao.RuntimeDemo.main (RuntimeDemo.java:33) Вызвано: java.io.IOException: CreateProcess ошибка = 87, Параметр неправильный \t at java.lang.ProcessImpl.create (собственный метод) \t at java.lang.ProcessImpl. (ProcessImpl.java:385) \t в java.lang.ProcessImpl.start (ProcessImpl.java:136) \t в java.lang.ProcessBuilder.start (ProcessBuilder.java:1028) \t ... 1 более –

+0

@prasath. Вы просто понизили мой ответ? –

Смежные вопросы