2013-05-02 134 views
1

我已经创建了一个GUI(swing),它执行一个批处理文件,该文件包含使用特定参数执行的命令提示符.exe文件。 当我手动运行批处理文件(通过双击它)时,一切都如预期。 问题是:命令提示符窗口未打开以显示进度,此外,直到我退出GUI(分叉?)之前,它才真正开始工作(仅启动)。当它开始工作时,在后台的某处工作,只在任务管理器中看到。 只打开一个空白的命令提示符窗口。使用Runtime.getRuntime()不会打开命令提示符exec

从周围挖一点,我已经构建的这个命令,让我与上述相同的结果:

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"); 

能否请您协助?

很抱歉,如果这听起来愚蠢..

+1

*“有什么想法?”*为了更快地获得更好的帮助,请发布[SSCCE](http://sscce.org/)。 – 2013-05-02 14:15:38

+1

考虑'ProcessBuilder',如图所示(http://stackoverflow.com/a/9832473/230513)。 – trashgod 2013-05-02 17:19:09

回答

2

这种方式为我工作:

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

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

+0

我想暂停在命令提示符下查看结果(在完成后不要关闭)。输入流是否实时更新?或者在这个过程结束之后? – Mark 2013-05-02 15:06:46

+0

好的,现在很清楚。您可能必须实现与InputStream和OutputStream的交互......问题是,用您的命令打开一个新窗口Process,因此Java代码无法等待批处理文件。除非有其他方法来处理启动命令,否则我认为让Java代码等待批处理程序终止会让您需要在流中实现一些逻辑。 – Martin 2013-05-03 15:10:09

+0

如果你想要从Java与流程交互的方式,下面是一个示例代码:http://www.rgagnon.com/javadetails/java-0014.html – Martin 2013-05-03 15:11:43

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,用于设置过程的环境,工作目录和重定向流。