Perl脚本通过JAVA错误

时间:2014-09-10 06:00:03

标签: java perl

我试图通过java运行这个perl脚本。下面是我的剧本

public class Log {
    public static void main(String[] args) throws IOException {
        Process proc =null;
        try
        {
            String[] commandAndArgs = {
                "cmd","/c","C:\\Users\\myscipt.pl"
            };
            proc = Runtime.getRuntime().exec(commandAndArgs);
            int returncode = proc.waitFor();
            if(proc.exitValue() == 0)
            {
                System.out.println("Command Successful");
                try
                {
                    BufferedReader input = new BufferedReader(new InputStreamReader(proc.getInputStream()));
                    String line="";

                    System.out.println("Process Executed"+returncode);
                    while ((line = input.readLine()) != null) {
                        System.out.println(line);
                    }
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
            }
            else{
                System.out.println("Process Executed"+returncode);
                System.out.println("Command Failure");
            }
        }
        catch(Exception t)
        {
            t.printStackTrace();
            System.out.println("Exception: "+ t.toString());
        }
        finally
        {
            proc.destroy();
        }
    }
}

因此,当我执行此脚本时,它运行完美。但是一旦我用下面的行替换脚本

"perl","C:\\Users\\myscipt.pl"

它会抛出返回码2错误。那么,我哪里错了?

3 个答案:

答案 0 :(得分:0)

使用此:

Process proc = Runtime.getRuntime().exec("perl C:\\Users\\myscipt.pl");

答案 1 :(得分:0)

当您从子进程获取错误返回代码时,除非您正常读取子进程输入和错误流并监视它们,否则无法弄清楚出现了什么问题。

重要的是,只有在请求父进程使用子进程输入/错误流之后才等待进程,因为waitFor()的文档说:

  

导致当前线程在必要时等待,直到进程   由此Process对象表示已终止。此方法返回   如果子进程已经终止,则立即执行。如果   子进程尚未终止,调用线程将被阻塞   直到子进程退出。

在子进程返回代码后,您将无法像在if(proc.exitValue() == 0)循环中那样读取其流。

因此,为了实现上述目的,您可以稍微修改下面的代码,尽管我还没有读过子进程的错误流,理想情况下应该这样做。要包含它,您可以参考:

Catching Perl exception in Java

修改后的代码,

Process proc =null;
try
{
    proc = Runtime.getRuntime().exec("perl C:\\Users\\myscipt.pl");
    BufferedReader input = new BufferedReader(new InputStreamReader(proc.getInputStream()));
    String line="";
    while ((line = input.readLine()) != null) {
        System.out.println(line);
        }   
    int returncode = proc.waitFor();
    System.out.println("Process Executed"+returncode);
}
catch(Exception t)
{
    t.printStackTrace();
    System.out.println("Exception: "+ t.toString());
}
finally
{   if(proc != null)
    proc.destroy();     
}

一旦你阅读了子进程的错误流,你就会知道发生了什么错误导致进程返回该代码。

答案 2 :(得分:0)

所以,我得到了解决方案。而不只是把

  

" perl的"" C:\用户\ myscipt.pl"

我更换了" perl"完全perl路径,即

  

" C:\用户\ Perl64 \ BIN \ perl.exe所在"" C:\用户\ myscipt.pl"

并且有效