2013-06-28 6 views
1

Java를 통해 Powershell 스크립트를 호출하려고하지만 해당 스크립트의 출력을 읽으려고하면 스크립트가 중단됩니다. 그것은에 달려 "input.readLine()"여기 powershell 스크립트를 시작한 후 java input.readLine이 중단됩니다.

우리가 시도 코드입니다 : 우리는이 솔루션 Java program hangs when trying to invoke powershell script 보고 시도

 String command = "cmd /c powershell C:\\_checkouts\\TestPowerShell\\passwordExpirationTime.ps1"; 
     Process p = Runtime.getRuntime().exec(command); 
     new InputStreamReader(p.getInputStream()); 

     BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 

     StringBuilder stringBuilder = new StringBuilder();; 
     for (String line = input.readLine(); line != null; line = input.readLine()) { 
      stringBuilder.append(line); 
     } 

     input.close(); 

     String msg = stringBuilder.toString(); 

     System.out.println("msg: " + msg); 

그러나 그 제안 중 어느 것도 우리를 위해 일했다.

또한 cmd/c 및 cmd/k를 사용하지 않고 시도했습니다. 모든 스크립트를 호출 할 수있는 제네릭 클래스로이 스크립트를 사용하기를 원합니다. 즉 BAT, BASH, SH, Powershell 등

아이디어가 있으십니까?

try{ 
     final ProcessBuilder pb = new ProcessBuilder("powershell","C:\\psFile.ps1"); 
     pb.redirectInput(Redirect.from(new File("NUL"))); 
     final Process p = pb.start(); 
     final int retcode = p.waitFor(); 

     InputStream is = p.getInputStream(); 
     InputStreamReader isr = new InputStreamReader(is); 
     BufferedReader br = new BufferedReader(isr); 
     String line; 

     while ((line = br.readLine()) != null) { 
      System.out.println(line); 
     } 
     br.close(); 
    }catch (Exception e){ 
     e.printStackTrace(); 
    } 

는 여기에 몇 가지 추가 정보입니다 : 여기 아래의 대답

덕분에 일 코드입니다. 우리의 파워 쉘은 제한적이기 때문에 오류를 반환하고있었습니다. 그래서 NUL 로의 모든 리디렉션이 필요했습니다. 우리는 그 고정 그것은 우리가 우리의 코드를 단순화 할 수 있었다 오류를 반환하지되자 :

try{ 
     final ProcessBuilder pb; 

     pb = new ProcessBuilder(args); 

     final Process p = pb.start(); 

     InputStream is = p.getInputStream(); 
     InputStreamReader isr = new InputStreamReader(is); 
     BufferedReader br = new BufferedReader(isr); 
     String line; 

     while ((line = br.readLine()) != null) { 
      System.out.println(line); 
     } 
     br.close(); 
    }catch (Exception e){ 
     e.printStackTrace(); 
    } 

답변

1

ProcessBuilder를 사용합니다. 소량의 I/O를 암시하는 모든 프로세스는 Runtime.exec()을 통해 실행을 철저히 거절해야합니다. 아쉽게도이를 감지 할 수 없습니다. 그리고 오라클은 불만이라고 @Deprecated이라고 표시하지 않았습니다. 어쨌든

가 :

final File logFile = new File("/path/to/logfile"); 
final ProcessBuilder pb = new ProcessBuilder("powershell", "/path/to/the/ps1"); 
pb.redirectOutput(Redirect.to(logFile)); 
pb.redirectErrorStream(true); 

final Process p = pb.start(); 
final int retcode = p.waitFor(); 

// deal with retcode 
// read result from the log file 
+0

내가이 일을 시도했지만이 p.waitFor에 달려(); 내가 주석을 달고 디버거를 기다리거나 잠시 멈추고 계속 작동하면 계속됩니다. 하지만 waitFor()를 사용하면 프로세스가 끝나지 않아 계속 진행되지 않습니다. – user2533615

+0

'pb.redirectInput (Redirect.from (new File ("NUL"))' – fge

+0

Ok '가 성공했습니다! 입력을 어딘가에 보내야하는 것 같습니다. Linux와 OSX에서이 크로스 플랫폼을 사용하는 데 관심이 있습니까? ? 그것을 만드는 방법에 대한 아이디어는 임시 파일에 쓸 필요는 없지만 모두 메모리에서 끝낼 수는 있겠습니까? – user2533615

관련 문제