在Groovy中捕获进程输出

在Groovy中捕获进程输出,groovy,Groovy,我有一个Groovy脚本,它通过一个目录递归查找.png文件,并在每个目录上调用(一个命令行实用程序)。pngquant的输出应打印在终端上。有关守则如下: def command = "pngquant -f -ext .png" root.eachFileRecurse(groovy.io.FileType.FILES) {File file -> if (file.name.endsWith('.png')) { println "Compressing

我有一个Groovy脚本,它通过一个目录递归查找.png文件,并在每个目录上调用(一个命令行实用程序)。pngquant的输出应打印在终端上。有关守则如下:

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)        
    }
}
脚本工作正常,但一旦处理完所有文件,stout似乎仍在被重定向,因为除非我用Ctrl+C终止进程,否则命令提示符永远不会出现。我是否需要以某种方式“撤消”

或者是否有更好的方法将此进程的输出重定向到控制台?我想我可以简单地通过添加
System.exit(0)
来解决这个问题,但这似乎不是正确的解决方案。此问题仅在Linux上出现。

而不是

    pngquantCmd.consumeProcessOutput(System.out, System.err)        
这将启动两个线程来读取输出,无论进程的情况如何,您都应该尝试

    pngquantCmd.waitForProcessOutput(System.out, System.err)
这将重定向进程输出,然后等待它完成,然后再继续:-)

您也可以这样做

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

waitForProcessOutput(System.out,System.err)
工作得更好吗?@tim_-yates是的,它工作得更好,非常感谢!如果你把它作为一个答案,我会接受的,用
consumeProcessOutput
和StringBuffers加上
waitForOrKill
也是不好的-缓冲区有时仍然写在
waitForOrKill
之后,导致不可预测的结果
waitForProcessOutput
是一种方法。
Process pngquantCmd = imgCommand.execute();
def output= pngquantCmd.text;
println("Output : " + output);