我正在尝试让我的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,但是当我手动将它输入命令行时它是完全正常的
有什么想法吗?如果您有任何问题我可以帮助您,请告诉我。
答案 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二进制文件的完整路径。