2014-06-25 119 views
0

我期待從Java'ProcessBuilder(在Windows)中運行以下Unix命令。CommandLine使用Java中的ProcessBuilder和程序之間的管道

$ gensky 1 21 11 | genskyvec -m 1 > skyvec_1-21-11_1.skv 

所以我寫了這一點:

String cmd = String.format("C:\\Radiance4.2\\bin\\gensky 1 21 11 | %s -m 1 > %s\n", "C:\\Radiance4.2\\bin\\genskyvec", "C:\\Radiance4.2\\temp\\output_test.skv"); 

這:

ProcessBuilder builder = new ProcessBuilder(cmd); 
builder.redirectErrorStream(true);     
Process process = null; 
try { 
    process = builder.start(); 
    System.out.println("Started Processing!"); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

但繼續得到錯誤 - 沒有找到該程序。任何想法我做錯了什麼?

+0

使用'名單'傳遞來傳遞參數 –

+0

即。列表 command = new ArrayList (); \t command.add(「cmd.exe」); \t command.add(「/ C」); \t command.add(「start」); –

+0

我想在windows上是'gensky.exe'等等。我想'gensky.exe'對管道一無所知,這是shell的一個特性(如果你想將'cmd.exe'稱爲一個shell ..)。 –

回答

0

使用directory()到工作目錄設置爲C:\\Radiance4.2\\bin\\並傳遞List<String>

列表CMD =新的ArrayList(); cmd.add(「genskyvec」); cmd.add(「1」); cmd.add(「21」); cmd.add(「11」); //所有參數

,並使用redirectOutput()提交你與>

+0

這工作謝謝。然而,「gensky」輸出的第二個程序「genskyvec」被編寫爲Perl批處理作業。任何想法如何我可以執行一個Windows cmd.exe一次運行整個UNIX命令?我不需要捕獲Java中的進程輸出,因爲程序已經在特定文件夾中輸出數據文件。 –

+0

你可以重定向輸出從第一個命令在一個臨時文件,然後讀取該文件並將數據作爲輸入提供給第二個命令? –

+0

是的,我嘗試過。但Perl腳本對我來說完全陌生。我試圖在Perl中找到一個read()函數,但不明白它。 –