[英]java input.readLine hangs after starting a powershell script
我们试图通过Java调用Powershell脚本,但是当我们尝试读取该脚本的输出时,该脚本会挂起。 它挂在“ input.readLine()”上
这是我们尝试过的代码:
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);
我们尝试查看此解决方案,尝试调用Powershell脚本时Java程序挂起,但这些建议均对我们没有帮助。
我们还尝试了不使用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();
}
这是一些其他信息。 我们的Powershell正在返回错误,因为它受到限制。 这就是为什么我们需要所有重定向到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();
}
使用ProcessBuilder
。 任何暗示少量I / O的进程都应该完全拒绝通过Runtime.exec()
运行,可惜它无法检测到。 而且Oracle尚未将其标记为@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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.