2012-07-20 101 views
11

我有一個Groovy腳本通過查找.png文件的目錄遞歸,並在每個文件上調用pngquant(一個命令行實用工具)。 pngquant的輸出應打印在終端上。相關的代碼是:Groovy中的捕獲過程輸出

def command = "pngquant -f -ext .png" 

root.eachFileRecurse(groovy.io.FileType.FILES) {File file -> 

    if (file.name.endsWith('.png')) { 
     println "Compressing file: $file" 

     def imgCommand = "$command $file.absolutePath" 

     Process pngquantCmd = imgCommand.execute() 
     pngquantCmd.consumeProcessOutput(System.out, System.err)   
    } 
} 

該腳本工作正常,但一旦所有的文件都已經被處理,看起來粗壯仍然被重定向,因爲除非我殺死Ctrl鍵的過程中從來沒有出現在命令提示符 + C。我需要以某種方式「撤消」

pngquantCmd.consumeProcessOutput(System.out, System.err)   

或者有沒有更好的方法來重定向此過程的輸出到控制檯?我想我可以簡單地通過添加System.exit(0)來解決這個問題,但這看起來並不是正確的解決方案。這個問題只發生在Linux上。

+0

'waitForProcessOutput(System.out,System.err)'是否更好? – 2012-07-20 12:52:08

+0

@tim_yates是的,它效果更好,非常感謝!如果您將其作爲答案發布,我會接受它 – 2012-07-20 13:05:23

回答

19

而不是

pngquantCmd.consumeProcessOutput(System.out, System.err)   

這將啓動幾個線程讀取輸出,不管過程的局面在犁地的,你應該嘗試

pngquantCmd.waitForProcessOutput(System.out, System.err) 

這將重定向輸出的過程然後等待它完成後再繼續前進:-)

0

您也可以做

Process pngquantCmd = imgCommand.execute(); 
def output= pngquantCmd .in.text; 
println("Output : " + output);