簡體   English   中英

從Java運行命令會產生空輸出

[英]Running command from java produces empty output

我需要使用Java運行以下命令,但在終端中運行正常

svn列表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);
    }

不要通過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重定向到某個地方,太)

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

這對我有用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM