getRuntime (). exec не работает должным образом - PullRequest
0 голосов
/ 03 июня 2011

Я пытаюсь заставить мою java-программу запускать команду svn из командной строки, которая будет записывать журналы в файл xml.

Это то, что я хочу сделать:

Runtime.getRuntime().exec("cmd.exe /c svn log /location/ --xml > c:\\output.xml");

однако он ничего не напечатает в xml-файле.

, когда я введу «svn log / location / --xml> output.xml» непосредственно в cmd, однако он напечатаетжурналы, как и ожидалось, в файл XML.

Более того, когда я использую следующий код, он без проблем напечатает «test» в файл XML.

Runtime.getRuntime().exec("cmd.exe /c echo \"test\" > c:\\work\\output.xml");

OK, послеЧтение Когда Runtime.exec () Wont, я определил, что по какой-то причине svn не распознается, когда я запускаю команду с Java, но это прекрасно, когда я ввожу ее вручную в командной строке

Есть идеи?Дайте мне знать, если у вас есть какие-либо вопросы, с которыми я мог бы вам помочь.

Ответы [ 3 ]

3 голосов
/ 03 июня 2011

AFAIU (из того, что я видел в похожих вопросах на форумах) перенаправление (>) не работает при использовании в Runtime.exec().

2 голосов
/ 03 июня 2011

Следуйте советам отсюда http://www.ensta -paristech.fr / ~ diam / java / online / io / javazine.html

Рассмотрим следующую строку кода:

Process p = Runtime.getRuntime().exec("/bin/sh -c > /bin/ls > ls.out");

Это предназначено для выполнения оболочки Bourne и выполнения оболочкой команды ls, перенаправляя вывод ls в файл ls.out.Причина использования / bin / sh состоит в том, чтобы обойти проблему перенаправления stdout внутренними компонентами Java.К сожалению, если вы попробуете это, ничего не произойдет.Когда эта командная строка передается методу exec (), она разбивается на массив строк с элементами "/ bin / sh", "-c", "/ bin / ls", ">" и "ls.out».Это не удастся, так как sh ожидает только один аргумент для параметра -c.Чтобы выполнить эту работу, попробуйте:

String[] cmd = {"/bin/sh", "-c", "/bin/ls > out.dat"};
Process p = Runtime.getRuntime().exec(cmd);

Поскольку командная строка уже является последовательностью строк, строки просто загружаются в массив команд методом exec () и передаютсяк новому процессу как есть.Таким образом, оболочка увидит «-c» и команду «/ bin / ls> ls.out» и выполнится правильно.

Я предлагаю изменить вашу команду на

String[] cmd = {
  "cmd.exe",
  "/c",
  "c:\\path\\to\\svn log /location/ --xml > c:\\output.xml"
};
Process p = Runtime.getRuntime().exec(cmd);
1 голос
/ 03 июня 2011

Можете ли вы указать полный путь к вашему двоичному файлу SVN в первом вызове метода exec.

...