如何从Java程序中调用一个bat文件

3

我已经创建了一个批处理文件来调用Java类。现在我已经在swing中创建了一个GUI。在那个swing中,我有一个按钮作为开始,对于它我有一个动作监听器,在其中我创建了以下代码

public void actionPerformed(java.awt.event.ActionEvent evt)
{
    try 
    {

        File file = new File("F:/myprog/start.bat");

        Desktop.getDesktop().open(file);

    } catch (IOException e)

    {

        e.printStackTrace();

    }

    jButton1ActionPerformed(evt);

}

当我点击按钮时,会出现"Error: Could not find or load main class"的错误。
批处理文件:
javac *.java
java websphinx.workbench.Workbench
 pause

当我点击批处理文件时,应用程序会运行。但是从Java程序调用此批处理文件时,我会收到错误。出了什么问题?


3
你能使用:Runtime.getRuntime().exec('批处理文件的路径');吗? - damiankolasa
3
叫蝙蝠?按照这个做:http://25.media.tumblr.com/tumblr_m3xdy1jJL31qbu4f8o1_500.gif - barfuin
@MukulGoel Workbench是主类,当我点击批处理文件时,应用程序可以无问题运行。 - Murali
@Thomas 不是那个蝙蝠... - Murali
@Thomas:如果这是其他事情,人们可能会反对这种行为甚至会抱怨,但这太棒了。 - Hussain Akhtar Wahid 'Ghouri'
显示剩余4条评论
5个回答

2

在Java中,通常会在Runtime.getRuntime().exec中运行一个命令,需要将cmd.exe作为要运行的文件传递,并将批处理文件名作为参数。

try {
     Process p = Runtime.getRuntime().exec(
                    new String[]{"cmd.exe", "/c", "F:/myprog/start.bat"});
     InputStream in = p.getInputStream();
     OutputStream out = p.outputStream();
} catch (IOException e){
     e.printStackTrace();
}

2

批处理文件本身不是可执行文件,通常在其解释器内运行,因此您需要使用cmd.exe启动它。

请尝试以下操作:

ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", "F:\\myprog\\start.bat");
Process p = pb.start();

一种替代方法是:
Runtime.getRuntime().exec("cmd /c start F:/myprog/start.bat");

ProcessBuilder是首选的替代方案。它可以让您更好地控制外部进程,因为您可以指示程序等待批处理文件执行完成或与其并发运行。


1

试试这个

Runtime.getRuntime().exec("cmd /c start F:/myprog/start.bat");

1

我认为这不是批处理文件的问题,

看着 Error: Could not find or load main class

这似乎是一个类路径问题

你可能需要改进你的批处理文件

javac *.java
java -cp yourdrive:\path\to\class websphinx.workbench.Workbench
 pause

查看-cp变量。

当您按原样执行批处理文件时,它会运行;但是从您的程序中运行时,可能会因为作用域的更改而导致异常。您的Java类和批处理文件可能不在同一位置。


是的。Java类和批处理文件在不同的文件夹中。但我也尝试将bat文件放在类文件夹中并从GUI程序中调用,但错误仍然存在。 - Murali
@Murali:其他答案有帮助吗?更改批处理被调用的方式? - Mukul Goel
@Murali:你能否更新一下你的问题,包括你的项目结构在哪里?调用Java的位置在哪里?批处理在哪里?Workbench.java在哪里? - Mukul Goel
F:\project\data\collect - 批处理文件路径F:\project\data\collect\websphinx\workbench - 类文件路径 - Murali
让我们在聊天中继续这个讨论。 (http://chat.stackoverflow.com/rooms/19989/discussion-between-mukul-goel-and-murali) - Mukul Goel
显示剩余2条评论

0

您可以使用{{link1:Runtime#exec}}方法来实现:

Runtime.getRuntime().exec(new String[] { "cmd.exe", "/c", "F:\\myprog\\start.bat" });

请注意,您实际运行的程序是带有 /c 开关的 cmd.exe,后跟 Windows 格式中的批处理文件名及其路径。

请参考问题中的操作评论,这并不是实际的问题。 - Mukul Goel
@MukulGoel:很有可能。我已经阅读了问题和评论,现在我不知道OP在问什么了。 - T.J. Crowder
是的,我也是这样。他不确定自己在问什么。他所做的是,在点击一个按钮时,调用一个批处理程序,该程序首先编译当前目录中的所有文件,然后调用“暂停”类。现在,这个语句会抛出错误:“错误:找不到或加载主类”。我认为就是这样,而且这不是一个“无法运行批处理”的错误。 - Mukul Goel
@MukulGoel 你好,我有一个应用程序。我过去是通过cmd运行该应用程序。为了避免这种情况,我创建了一个批处理文件来运行该应用程序。为了提供更多的用户界面,我创建了一个swing,并在其中添加了一些按钮。当我点击其中一个按钮时,我需要运行调用应用程序的批处理文件。就是这样... - Murali

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