我试图通过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错误。那么,我哪里错了?
答案 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"
并且有效