3

我写了一些代码来执行.bat文件。其中包含一些命令,如设置 java classpath,etc..最后有一个命令运行 Java 类文件。HelloWorld class转换一些 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文件的效果。还有其他方法可以尝试吗?

.bat我可以通过 Eclipse 控制台查看文件中的内容。但它没有提供所需的输出。所需的输出意味着当我双击.bat文件时,它执行得很好。但是通过java 电话,我只能看到内容。

4

4 回答 4

2

使用 cmd.exe 时使用/C-Parameter 传递命令:

String []commands = {"cmd.exe","/C","C:/MyWork/Java/classes/run.bat"} ;
于 2013-11-05T09:07:54.187 回答
1

据此,Windows CMD 需要参数来执行这样的命令/c尝试这个:

String []commands = {"cmd.exe","/c","C:/MyWork/Java/classes/run.bat"} ;
于 2013-11-05T09:08:44.457 回答
0

您不会读取批处理文件的错误输出,因此,您将永远不会看到从那里或从 CMD.EXE 本身打印的任何错误消息。此外,子程序可能会停止并等待您读取错误流。

请在此处查看相关讨论:如何使 java 程序同时打印 out.println() 和 err.println() 语句?

于 2013-11-05T11:39:26.850 回答
0

Windows 使用\ 反斜杠作为 Windows 和 MS-DOS 路径分隔符。正斜杠 / 在包中被 Java 接受java.io并翻译为路径分隔符,但不会被 Windows 直接接受或被cmd.exeshell 接受。

您可能还需要指定要在其中执行的批处理文件的工作目录,或者可能需要指定命令解释器的完整路径。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命令添加到批处理文件。这将使窗口保持打开状态,以便您可以验证批处理文件是否已启动,并逐阶段调试。

于 2013-11-05T09:42:03.413 回答