2

我创建了一个 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");

你能帮忙吗?

对不起,如果这听起来很愚蠢..

4

3 回答 3

3

这种方式对我有用:

new Thread() {
@Override public void run() {
try {    
Runtime.getRuntime().exec("cmd.exe /c start " + Gui._batFile);
} catch (IOException e1) {
e1.printStackTrace();
}
}
}.run();
于 2013-05-02T16:01:53.437 回答
1

垃圾神可能正在做某事。我们遇到了带有空格的路径的问题。这是来自jre 7u21 的发行说明

对 Runtime.exec 的更改

Runtime.exec(String)在 Windows 平台上,对指定为和方法的命令字符串的解码进行了改进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 用于设置环境、工作目录和重定向流程的流。

于 2013-05-07T15:24:12.133 回答
0

您的 bat 文件是否需要用户交互,或者您为什么要暂停命令?如果是这样,Runtime.exec 只是运行没有窗口的文件,你为什么想要一个窗口?>您可以从 exec 中获取 Process 对象,从该对象中您可以获取 InputStream(如果需要,还可以获取 OutputStream),以便您可以打印输出或与流程交互。

于 2013-05-02T14:49:52.960 回答