【问题标题】:Command prompt doesn't open with Runtime.getRuntime().exec命令提示符无法使用 Runtime.getRuntime().exec 打开
【发布时间】:2024-01-03 03:58:01
【问题描述】:

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

您能帮忙吗?

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

【问题讨论】:

  • “有什么想法吗?” 如需尽快获得更好的帮助,请发帖SSCCE
  • 考虑ProcessBuilder,插图here

标签: java swing process command-prompt runtime.exec


【解决方案1】:

这种方式适合我:

new Thread() {
@Override public void run() {
try {    
Runtime.getRuntime().exec("cmd.exe /c start " + Gui._batFile);
} catch (IOException e1) {
e1.printStackTrace();
}
}
}.run();

【讨论】:

    【解决方案2】:

    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") 尝试使用参数"Programs\\foo.exe""bar" 启动程序"C:\\My"。此命令可能会失败,并出现异常,指示找不到 "C:\My"

    示例Runtime.getRuntime().exec("\"C:\\My Programs\\foo.exe\" bar") 是尝试启动程序"\"C:\\My"。此命令将失败并出现异常,表明程序具有嵌入的引号。

    需要启动程序名称中带有空格的程序的应用程序应考虑使用Runtime.exec 的变体,它允许在数组中指定命令和参数。

    另外,自 JDK 5.0 以来创建操作系统进程的首选方法是使用 java.lang.ProcessBuilderProcessBuilder 类有一个更完整的 API 用于设置环境、工作目录和重定向进程的流。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我想暂停以在命令提示符中查看结果(避免在完成后关闭)。输入流是否实时更新?还是在流程完成后?
      • 好的,现在很清楚了。您可能必须实现与 InputStream 和 OutputStream 的交互...问题是,使用您的命令,您正在打开一个新窗口 Process,因此 Java 代码无法等待批处理文件。除非有其他方法可以使用 start 命令,否则我认为让 Java 代码等待批处理程序终止将要求您使用流实现一些逻辑。
      • 如果你想走Java与进程交互的方式,这里有一个示例代码:rgagnon.com/javadetails/java-0014.html