getRuntime()。exec没有按预期执行

时间:2011-06-03 17:26:59

标签: java command-line runtime.exec

我正在尝试让我的java程序从命令提示符运行svn命令,该命令会将日志写入xml文件。

这就是我想要的:

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

但是,它不会向xml文件打印任何内容。

当我直接在cmd中输入“svn log / location / --xml> output.xml”时,它会按预期将日志打印到xml文件中。

此外,当我使用以下代码时,它会将“test”打印到xml文件中而不会出现问题。

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

好的,读完之后当Runtime.exec()不行时,我已经确定由于某种原因,当我用java运行命令时无法识别svn,但是当我手动将它输入命令行时它是完全正常的

有什么想法吗?如果您有任何问题我可以帮助您,请告诉我。

3 个答案:

答案 0 :(得分:3)

AFAIU(我在论坛上的类似问题中看到的)重定向(>)在Runtime.exec()中使用时不起作用。

答案 1 :(得分:2)

请遵循此处的建议http://www.ensta-paristech.fr/~diam/java/online/io/javazine.html

  

考虑以下代码行:

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

这是为了执行Bourne   shell并让shell执行   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()方法传递而来   按原样进入新流程。就这样   shell会看到一个“-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);

答案 2 :(得分:1)

您可以尝试在第一个exec方法调用中提供svn二进制文件的完整路径。