我创建了一个GUI(swing),它执行一个批处理文件,其中包含一个带有特定参数的命令提示符.exe文件执行。 当我手动运行批处理文件(通过双击它)时,一切都按预期进行。 问题是:命令提示符窗口没有打开以显示进度,而且,在我退出GUI(分叉?)之前,它并没有真正开始工作(仅启动)。当它开始工作时,它在后台的某个地方工作,只在任务管理器中看到。 只打开一个空白的命令提示符窗口。
从挖掘一下,我构建了这个命令,给出了与上面相同的结果:
Runtime.getRuntime().exec("cmd.exe /c start \"Encoding\" cmd.exe /c start md \"" + Gui.outputDirField.getText() + "\\encoderOutput\" & cd \"" + Gui.outputDirField.getText() + "\\encoderOutput\" & \"" + Gui._batFile + "\" & pause");
你能帮忙吗?
抱歉,如果它听起来很愚蠢......
答案 0 :(得分:3)
这种方式对我有用:
new Thread() {
@Override public void run() {
try {
Runtime.getRuntime().exec("cmd.exe /c start " + Gui._batFile);
} catch (IOException e1) {
e1.printStackTrace();
}
}
}.run();
答案 1 :(得分:1)
trashgod可能会出现问题。我们遇到了带空格的路径问题。这来自release notes for jre 7u21
对Runtime.exec的更改
在Windows平台上,对Runtime.exec(String)
,Runtime.exec(String,String[])
和Runtime.exec(String,String[],File)
方法指定的命令字符串的解码已得到改进,以更加严格地遵循规范。对于使用一个或多个这些方法的应用程序,如果程序名称中包含空格的命令,或者使用未正确引用的命令调用这些方法,这可能会导致问题。
例如,Runtime.getRuntime().exec("C:\\My Programs\\foo.exe bar")
尝试使用参数"C:\\My"
和"Programs\\foo.exe"
启动程序"bar"
。该命令很可能失败,并指出无法找到"C:\My"
的异常。
示例Runtime.getRuntime().exec("\"C:\\My Programs\\foo.exe\" bar")
是尝试启动程序"\"C:\\My"
。此命令将失败,并显示异常以指示程序具有嵌入的引用。
需要在程序名称中启动带空格的程序的应用程序应考虑使用允许在数组中指定命令和参数的Runtime.exec
变体。
或者,自JDK 5.0以来创建操作系统进程的首选方法是使用java.lang.ProcessBuilder
。 ProcessBuilder
类有一个更完整的API,用于设置环境,工作目录和重定向流的流。
答案 2 :(得分:0)
您的bat文件是否需要用户交互,或者您为什么要暂停命令?如果是这样,Runtime.exec只运行没有窗口的文件,为什么要一个Window? >你可以从exec获得一个Process对象,从这个对象中你可以获得一个InputStream(如果需要的话,还有一个OutputStream),这样你就可以打印输出或者与进程交互。