Мне нужно запустить команду 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);
}
Это работает для меня:
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();
Не проходите через 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 где-нибудь, слишком)
redirectOutput()
доступен только с Java 7.
Path
тоже. И это 2015 год, верно? :п
Перенаправление ввода-вывода не работает с 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();
ProcessBuilder
имеет .redirectOutput()
...
/c
из "команды cmd / C для запуска"? Я предлагаю вам попробовать запустить всю команду в командной строке с помощью командыcmd
Скорее всего, вы получаете ошибку, и, поскольку вы игнорируете поток ошибок, вы можете ' не вижу этого.