使用Java ProcessBuilder运行bat文件

4
我正在尝试使用Java进程构建器执行.bat文件,但它无法启动进程。请告诉我在这里做错了什么。当我将file.bat替换为./file.sh时,此代码在Linux环境中运行良好。
final ArrayList<String> command = new ArrayList<String>();
command.add(WORKING_DIR+File.separator+"file.bat");
final ProcessBuilder builder = new ProcessBuilder(command);
try {
    builder.redirectErrorStream(true);
    builder.start();
    } catch (IOException e) {
      logger.error("Could not start process." ,e);
} 

你能否发布 WORKING_DIR 变量的值? - fmodos
1
尝试使用Runtime类,这里有一个例子,它将能够很好地工作,http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html - user2320537
你在 file.bat 中使用了哪些命令? - Vishal K
阅读(并实现)当Runtime.exec()无法正常工作的所有建议。这可能会解决问题。如果没有,它应该提供更多关于失败原因的信息。然后忽略它引用的exec,使用ProcessBuilder构建Process。同时,将一个String arg拆分成String[] args以考虑包含空格的参数。 - Andrew Thompson
@user2320537:那不应该有任何影响。现在,Runtime.getRuntime().exec(...)是使用ProcessBuilder实现的。如果你不相信,请检查你的JDK源代码压缩包。 - Luke Woodward
显示剩余2条评论
2个回答

7

数组中的第一个元素必须是可执行文件。因此,您需要调用cmd.exe才能调用您的批处理文件。

ProcessBuilder builder = new ProcessBuilder(Arrays.asList(new String[] {"cmd.exe", "/C", WORKING_DIR + File.separator + "file.bat"}));

仍然存在同样的问题。它没有启动新进程,而是终止了现有的进程。 - Salman Raza
2
不需要调用cmd.exe,可以执行.bat文件。我刚写了一个小的测试案例:`import java.io.IOException;class Test {public static void main(String args[]) throws InterruptedException, IOException { ProcessBuilder processBuilder = new ProcessBuilder(args[0]); processBuilder.inheritIO(); Process process = processBuilder.start(); process.waitFor(); } }。 我有一个foo.bat文件:echo "Hello, world"。然后我做 java Test foo.bat` - Dan Halbert

1

确保批处理文件的路径正确。您可以使用调试器进行调试,或者放置一个sysout来确定:

final ArrayList<String> command = new ArrayList<String>();
System.out.println("Batch file path : " + WORKING_DIR+File.separator+"file.bat")
command.add(WORKING_DIR+File.separator+"file.bat");
final ProcessBuilder builder = new ProcessBuilder(command);
try {
    builder.redirectErrorStream(true);
    builder.start();
    } catch (IOException e) {
      logger.error("Could not start process." ,e);
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接