在Groovy中捕获进程输出

Dón*_*nal 16 groovy

我有一个Groovy脚本,它通过查找.png文件的目录进行递归,并在每个文件上调用pngquant(一个命令行实用程序).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)        
    }
}
Run Code Online (Sandbox Code Playgroud)

该脚本工作正常,但是一旦处理完所有文件,似乎仍然会重定向stout,因为除非我用Ctrl+ 终止进程,否则命令提示符永远不会出现C.我需要以某种方式"撤消"

pngquantCmd.consumeProcessOutput(System.out, System.err)        
Run Code Online (Sandbox Code Playgroud)

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

tim*_*tes 25

代替

    pngquantCmd.consumeProcessOutput(System.out, System.err)        
Run Code Online (Sandbox Code Playgroud)

无论进程情况如何,都会启动几个线程来读取输出并进行操作,您应该尝试

    pngquantCmd.waitForProcessOutput(System.out, System.err)
Run Code Online (Sandbox Code Playgroud)

这将重定向过程输出,然后等待它完成后再继续:-)


Ani*_*kur 5

你也可以这样做

Process pngquantCmd = imgCommand.execute();
def output= pngquantCmd.text;
println("Output : " + output);
Run Code Online (Sandbox Code Playgroud)