从java运行命令会产生空输出

时间:2015-01-23 08:08:19

标签: java command-line processbuilder

我需要使用java运行以下命令,但它在终端中运行正常

svn list http://192.168.0.19/svn/cc/Branch/Jobs/tt/jobs/ --username prasadh --password prasadh2k> output.txt的

但是当运行相同的via process builder时,它返回空结果。

我的代码:

    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);
    }

3 个答案:

答案 0 :(得分: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某处也是)

答案 1 :(得分:0)

I / O重定向与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();

答案 2 :(得分:-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();