2012-04-09 92 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文件中讀取它的話,那麼你需要兩次),這對於一行以上的內容來說有點尷尬。

所以它可能會更好地使用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 2012-04-10 09:17:31