2012-04-09 25 views
0

私はいくつかのことをするためにPerlスクリプトを呼び出す必要がある小さなツールを書いています。JavaプログラムからPerlスクリプトを実行するにはどうすればよいですか?

私はすでにそれをどのように呼び出すかを知っていますが、exec()のPerlスクリプトへの完全修飾パスを提供する必要があります。

このスクリプトを直接呼び出すことのできるパッケージとして提供する可能性はありますか?

実行可能な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

あなたは、文字列に/ストアあなたの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); 

編集:私はに忘れてしまいました-eとスクリプトの間にスペースを入れてください。また、スクリプト内でバックスラッシュと二重引用符をエスケープする必要があります(JavaのスクリプトをJARファイルから読み込むのではなく、スクリプトのインラインである場合は2回)、複数のライナーよりも少し面倒なことになります。

だから、おそらくPerlインタプリタの標準入力にスクリプトを記述するためにProcess.getOutputStreamを使用する方が良いでしょう:

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プログラムの1行(いくつか-eは許され、プログラムファイルを省略します) しかし、その1行だけではなく、その全体のスクリプト! – Stefan

関連する問題