bat文件无法在Java中执行。

3
我已经编写了一些代码来执行包含一些命令的.bat文件,例如设置Java classpath等。最后有一个命令运行Java类文件。HelloWorld类将一些xml文件转换并在某个文件夹中生成新的xml文件。当我双击.bat文件时,它可以正常执行,但是当我尝试运行时,无法得到与双击.bat文件相同的输出结果。如何才能让批处理程序执行,并且最好可以通过Java控制台查看结果。
以下是用于执行.bat文件的MyJava代码。
public void run2() {
        try {
            String []commands = {"cmd.exe","/C","C:/MyWork/Java/classes/run.bat"} ;
            Process p = Runtime.getRuntime().exec(commands);
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    p.getInputStream()));
            String line = null;
            while ((line = in.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

以下是设置为.bat文件的一些命令:
set CLASSPATH=%CLASSPATH%;C:/MyWork/Java
set CLASSPATH=%CLASSPATH%;C:/MyWork/Java/classes
java -cp test.jar;test2.jar test.HelloWorld

尝试使用"/C"命令,但它没有执行。实际上它没有双击.bat文件的效果。我还有其他方法可以尝试吗?
我可以通过Eclipse控制台看到.bat文件中的内容。但是它没有给出期望的输出。期望的输出意味着当我双击.bat文件时,它可以正常执行。但是通过java调用,我只能看到内容。

1
你如何启动你的程序?当使用java.exe运行它时,执行.bat文件时是否会看到一些输出? - piet.t
我添加了一个 "System.out.println("Done!!!");" 但它没有被执行,同时 while 循环也没有退出。程序永远不会终止。但是如果我删除 while 循环,它将在控制台中显示 "Done!!!" 消息并终止。 - English Learner
@EnglishLearner 首先,你必须从命令行尝试运行你的 *.bat 文件。如果这样可以,那么再从命令行运行你的 Java 程序。不要在某个集成开发环境或者 Windows Explorer 中鼠标点来点去,那只会浪费你的时间。 - Ingo
当然,@EnglishLearner,但我一直在阅读“在eclipse中,它是这样的,当我双击那个时”。这些都不相关。只需从命令行运行程序即可。还要注意,您应该阅读并复制错误输出,否则您将看不到发生的错误。 - Ingo
另外,请看这个链接:https://dev59.com/eW865IYBdhLWcg3wkPWD#3754881 - Ingo
显示剩余4条评论
4个回答

2

在使用cmd.exe时,使用/C参数传递命令:

String []commands = {"cmd.exe","/C","C:/MyWork/Java/classes/run.bat"} ;

1
根据this,Windows CMD需要/c参数来执行像这样的命令。请尝试此操作:
String []commands = {"cmd.exe","/c","C:/MyWork/Java/classes/run.bat"} ;

0

Windows使用\反斜杠作为Windows和MS-DOS路径分隔符。Java在java.io包中接受正斜杠/并将其转换为路径分隔符,但是它不会直接被Windows接受或被cmd.exe shell接受。

您可能还需要指定批处理文件要在其中执行的工作目录,或者可能需要完整路径cmd.exe命令解释器。

参见:Runtime.exec(String[] cmdarray, String[] envp, File dir)

String[] commands = {"C:\\Windows\\System32\\cmd.exe", "/c", 
    "C:\\MyWork\\Java\\classes\\run.bat"};
File workDir = new File( "C:/MyWork");
Process process = Runtime.getRuntime().exec( commands, null, workDir);

为了验证批处理文件是否运行,可以在批处理文件中添加一个pause命令。这将保持窗口打开,以便您可以验证批处理文件是否被启动,并逐个阶段进行调试。


我可以通过Eclipse控制台看到.bat文件内的内容。但它没有给出预期的输出。预期的输出意味着当我双击.bat文件时,它可以正常执行。但是通过Java调用时,我只能看到文件内容而不能执行。 - English Learner
1.) 我的cmd.exe版本(Windows 7)接受正斜杠。 2.) 在Java字符串文字中,您必须转义反斜杠("\\")。 - piet.t
反斜杠需要转义,\ -- @piet.t 的观点很好 -- 但我正在运行Win 7,刚刚测试了一下,它无法理解在 cmd /c path\batchfile 调用中的正斜杠。 - Thomas W
我使用的是Windows XP。但是,如果我们在其他Windows版本上部署应用程序,那不就会出问题了吗? - English Learner
@EnglishLearner -- 问题解决了。cmd /c Tom/test.bat在命令提示符下不起作用(我试过了),但是使用反斜杠可以,并成功运行了一个示例批处理文件。正如我在答案中所说,你必须在MS-DOS/Windows shell命令中使用反斜杠来表示路径。 - Thomas W
显示剩余6条评论

0

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