2012-07-20 54 views
11

Tôi có một tập lệnh Groovy đệ quy qua một thư mục tìm kiếm các tệp .png và gọi pngquant (một tiện ích dòng lệnh) trên mỗi tệp. Đầu ra của pngquant nên được in trên thiết bị đầu cuối. Các mã có liên quan là:bắt đầu quá trình ghi trong 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)   
    } 
} 

Các kịch bản hoạt động tốt, nhưng một khi tất cả các tập tin đã được xử lý, có vẻ như mập mạp vẫn đang được chuyển hướng, vì nhắc lệnh không bao giờ xuất hiện, trừ khi tôi giết chết quá trình với Ctrl + C. Tôi có cần phải bằng cách nào đó "hoàn tác"

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

hoặc có cách nào tốt hơn để chuyển hướng đầu ra của quy trình này sang bảng điều khiển không? Tôi đoán tôi có thể giải quyết vấn đề này chỉ đơn giản bằng cách thêm System.exit(0), nhưng điều này dường như không phải là giải pháp đúng. Vấn đề chỉ xảy ra trên Linux.

+0

'waitForProcessOutput (System.out, System.err)' có hoạt động tốt hơn không? –

+0

@tim_yates vâng, nó hoạt động tốt hơn rất nhiều, cảm ơn rất nhiều! Nếu bạn đăng câu trả lời đó, tôi sẽ chấp nhận nó –

Trả lời

19

Thay vì

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

nào sẽ bắt đầu một vài bài để đọc các kết quả đầu ra và cày trên không phụ thuộc vào quá trình tình hình, bạn nên cố gắng

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

Mà sẽ chuyển hướng đầu ra quá trình và sau đó đợi nó kết thúc trước khi chuyển sang :-)

0

Bạn cũng có thể làm

Process pngquantCmd = imgCommand.execute(); 
def output= pngquantCmd .in.text; 
println("Output : " + output); 
Các vấn đề liên quan