2014-09-10 3 views
-1

Я пытаюсь запустить этот скрипт perl через java. ниже мой сценарийPerl Script через JAVA Ошибка

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(); 
     } 
    } 
} 

Поэтому, когда я выполняю этот скрипт, он работает отлично. Но как только я заменяю сценарий ниже строки

Это бросает мне код возврата 2. Итак, где я ошибаюсь?

ответ

0

Используйте это:

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

я попробовал это раньше б это тоже не работает. –

+0

Нет никакой разницы между передачей как массива «perl», «C: \ Users \ myscipt.pl» и передачей его как строки «perl C: \\ Users \\ myscipt.pl» – BatScream

+0

@ Kushal Kumar, у вас есть perl в переменной PATH? –

0

Вы не можете понять, что на самом деле пошло не так, когда вы получите обратный код ошибки из дочернего процесса, если вы не читали ввода дочернего процесса и ошибок потоков simaltaneously, и монитор их.

Важно отметить, что вы ждете процесса только после того, как вы попросите свой родительский процесс, чтобы потреблять потоки ввода/ошибки процесса ребенка, так как в документации 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();  
} 

После того, как вы читаете поток ошибок дочернего процесса, вы бы знали, что произошла ошибка, которая сделала процесс верните этот код.

0

Итак, я получил решение. Вместо того, чтобы просто положить

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

я заменил "Perl" полный путь PERL т.е.

«C: \ Пользователи \ Perl64 \ Bin \ perl.exe», "C: \ Users \ myscipt.pl"

и работал