使用Java从BAT文件获取输出

使用Java从BAT文件获取输出,java,networking,windows-7,process,runtime.exec,Java,Networking,Windows 7,Process,Runtime.exec,我正在尝试运行一个.bat文件并获取输出。我可以运行它,但无法在Java中获得结果: String cmd = "cmd /c start C:\\workspace\\temp.bat"; Runtime r = Runtime.getRuntime(); Process pr = r.exec(cmd); BufferedReader stdInput = new BufferedReader( new InputStreamReader( pr.getInputStream()

我正在尝试运行一个.bat文件并获取输出。我可以运行它,但无法在Java中获得结果:

String cmd = "cmd /c start C:\\workspace\\temp.bat";

Runtime r = Runtime.getRuntime();
Process pr = r.exec(cmd);

BufferedReader stdInput = new BufferedReader(
    new InputStreamReader( pr.getInputStream() ));

String s ;
while ((s = stdInput.readLine()) != null) {
    System.out.println(s);
}

结果是
null
。不知道我为什么会得到这个。请注意,我使用的是Windows 7。

在调用
process.waitFor()
后,需要启动一个新线程来读取终端输出流并将其复制到控制台

做一些类似于:

String line;
Process p = Runtime.getRuntime().exec(...);
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
    System.out.println(line);
}
input.close();
ProcessBuilder builder = new ProcessBuilder("/bin/bash");
builder.redirectInput();
Process process = builder.start();

while ((line = reader.readLine ()) != null) {
    System.out.println ("Stdout: " + line);
}
更好的方法是使用
ProcessBuilder
类,并尝试编写如下内容:

String line;
Process p = Runtime.getRuntime().exec(...);
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
    System.out.println(line);
}
input.close();
ProcessBuilder builder = new ProcessBuilder("/bin/bash");
builder.redirectInput();
Process process = builder.start();

while ((line = reader.readLine ()) != null) {
    System.out.println ("Stdout: " + line);
}
改用

BufferedReader stdInput = new BufferedReader(new 
 InputStreamReader( pr.getInputStream ));
使用“cmd/c start[…]”运行批处理文件将创建一个子进程,而不是直接运行批处理文件

因此,您将无法访问其输出。 要使其正常工作,您应该使用:

String cmd = "C:\\workspace\\temp.bat";

它在Windows XP下工作。

阅读(并实施)所有的建议。这可能会解决问题。如果没有,它应该提供更多关于失败原因的信息。然后忽略它引用的
exec
,并使用
ProcessBuilder
构建
流程。还可以将
字符串arg
分解为
字符串[]args
,以说明本身包含空格的参数。不要忽略错误流。对于健壮的代码,两个都必须使用。对于这两个,while loop required separated这实际上并没有回答问题。dude我尝试了这个方法,但不起作用,我得到的是null值,而不是ProcessBuilder中的命令结果,没有.redirectInput();有什么建议吗?我使用NetBeans BTW这解决了另一个问题,bat文件包含start run.bat命令,我还需要其他结果:(您可以使用CALL在主脚本中运行其他批处理文件。有关参考信息,请参阅和。