2012-07-20 19 views
11

Mam skrypt Groovy, który powtarza się przez katalog szukający plików .png, i wywołuje pngquant (narzędzie wiersza poleceń) na każdym z nich. Wyjście pngquant powinno być wydrukowane na terminalu. Odpowiedni kod jest:Przechwytywanie danych wyjściowych w 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)   
    } 
} 

Skrypt działa poprawnie, ale gdy wszystkie pliki zostały przetworzone, wydaje się, że mocny jest nadal przekierowywane, ponieważ polecenia prompt nigdy nie pojawia się chyba zabiję proces z Ctrl + C. Czy muszę jakoś "cofnąć" lub czy istnieje lepszy sposób przekierowania wyników tego procesu do konsoli? Myślę, że mógłbym rozwiązać ten problem, po prostu dodając System.exit(0), ale to nie wydaje się być właściwym rozwiązaniem. Problem występuje tylko w systemie Linux.

+0

Czy funkcja 'waitForProcessOutput (System.out, System.err) działa lepiej? –

+0

@tim_yates tak, działa dużo lepiej, bardzo dziękuję! Jeśli napiszesz to jako odpowiedź, zaakceptuję to –

Odpowiedz

19

Zamiast

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

który rozpocznie się kilka wątków do zapoznania się z wyjść i pług na niezależnie od procesu sytuacji, należy spróbować

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

który odsyła wyjście procesu a następnie zaczekaj, aż się skończy, zanim przejdziesz dalej :-)

0

Możesz także wykonać:

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