2012-04-09 93 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