2012-04-09 2 views
0

Я пишу небольшой инструмент, который должен вызвать скрипт Perl, чтобы сделать что-то.Как я могу выполнить скрипт Perl из своей Java-программы?

Я уже знаю и написал код о том, как его вызвать, но я должен предоставить полный путь к скрипту Perl для exec().

Есть ли возможность предоставить этот скрипт как своего рода пакет, который можно вызвать напрямую?

Я хочу сгенерировать исполняемый JAR позже и также хочу, чтобы весь инструмент предоставлял скрипт Perl и не знал, где он находится.

В настоящее время его как:

private void extractAudioStream() { 
    inputFile = "C:\\Users\\Stefan\\Documents\\temp_tshark\\forward_stream.pcap"; 
    outputFile_audiostream = "C:\\Users\\Stefan\\Documents\\temp_tshark\\forward_stream.pcm"; 

    String perl_cmd = "perl C:\\Users\\Stefan\\Documents\\tshark_bin\\rtp_dump.pl " + inputFile + " " + outputFile_audiostream; 

    try { 
     p = Runtime.getRuntime().exec(perl_cmd); 

Надежда вопрос достаточно ясно.

Я думаю, что это может быть не так просто, потому что команда perl ждет полностью квалифицированного пути? Есть ли возможность обнаружить мое текущее местоположение и передать его моей cmd-String?

ответ

0

Вы можете написать сценарий в файл, сказать временный файл и выполнить его оттуда, а затем удалить его, когда закончите.

1

если вы читаете/STORE вашего PERL скрипт в строке, вы можете выполнить это следующим образом:

perlScript = "print \"HELLO\\n\"; print \"CIAOOOO\\n\";"; 
String perl_cmd = "echo \"" + perlScript + "\" |perl"; 
Runtime.getRuntime().exec(perl_cmd); 

Надеется, что это помогает ...

2
String perl_cmd = "perl -e \"print \\\"bla\\n\\\";\";" 
Runtime.getRuntime().exec(perl_cmd); 

Edit: Я забыл введите пробел между -e и скриптом; вам также придется избегать обратных косых черт и двойных кавычек в вашем скрипте (дважды, если вы являетесь скриптом inline в Java, а не читаете его из файла jar), что делает вещи немного неудобными для более чем одного лайнера.

Так что, вероятно, будет лучше использовать Process.getOutputStream, чтобы написать сценарий к стандартному вводу интерпретатора Perl в:

String perlScript = "print \"hello\";"; // get from a jar with Class.getResourceAsStream() 
    Process p = new ProcessBuilder("perl").redirectErrorStream(true).redirectOutput(ProcessBuilder.Redirect.INHERIT).start(); 
    BufferedWriter w = new BufferedWriter(new OutputStreamWriter(p.getOutputStream())); 
    w.write(perlScript); 
    w.close(); 
    p.waitFor(); 
+0

если я запускаю эту команду локально с моей командной строки, это не выполняется. Далее он говорит от справки: -e программировать одну строку программы (разрешено несколько -e, пропустить программный файл) Но это не одна строка, ее целый скрипт! – Stefan

Смежные вопросы