Java:使用exec()方法将.bat文件的输出重定向到其他文本文件中?

时间:2014-12-18 13:37:19

标签: java batch-file cmd command

Java对我来说是新的。 我正在使用Runtime.getRuntime.exec(filename.bat)执行批处理文件,此批处理文件执行命令ant encrypt.password -Dvalue=somevalue>log.txt并将其输出重定向到log.txt文件。 我面临的问题是,如果我手动运行它,批处理文件工作正常,但是当程序执行它时,它只会创建空白' log.txt'

mybat.bat批处理文件的内容如下:

cd/
c:
cd c:/ant_builds/thinclient
ant encrypt.password -Dvalue=someValue >C:/log.txt

Java代码如下:

Process p=Runtime.getRuntime.exec("C:\mybat.bat");
p.waitFor();

似乎在创建日志文件之后,同时命令正在执行控制来自进程。

我已经阅读了近50个线程但是没有得到解决方案。请帮帮我。

2 个答案:

答案 0 :(得分:4)

使用ProcessBuilder创建流程并调用redirectOutput(File)重定向并将输出附加到文件中。

试试这段代码:

public class Test {
    ProcessBuilder builder;
    Path log;

    public Test() {
        try
        {
            log = Paths.get("C:\\log.txt");
            if (!Files.exists(log))
            {
                Files.createFile(log);
            }
            builder = new ProcessBuilder("ant", "encrypt.password", "-Dvalue=someValue");
            builder.directory(Paths.get("C:\\ant_builds\\thinclient").toFile());
            builder.redirectOutput(ProcessBuilder.Redirect.appendTo(log.toFile()));
            builder.start();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new Test();
    }
}

对于jdk 1.6或更低版本,请使用以下代码:

public class Test {
    ProcessBuilder builder;
    Path log;
    Process process;
    BufferedReader br;
    PrintWriter pw;
    Charset charset = Charset.forName("UTF-8");

    public Test() {
        try {
            log = new File("C:\\log.txt");
            if (!log.exists()) {
                log.createNewFile();
            }
            builder = new ProcessBuilder("ant", "encrypt.password","-Dvalue=someValue");
            builder.directory(new File("C:\\ant_builds\\thinclient"));
            builder.redirectErrorStream(true);
            process = builder.start();
            br = new BufferedReader(new InputStreamReader(process.getInputStream(),charset));
            pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(log, true), charset));

            (new Thread() {
                public void run() {
                    try {
                        while (process.isAlive()) {
                            String s = null;
                            while ((s = br.readLine()) != null) {
                                pw.print(s);
                                pw.flush();
                            }
                        }
                        br.close();
                        pw.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new Test();
    }
}   

我不确定ProcessBuilder参数的顺序和列表,因此请尝试使用它们以使代码正常工作。

答案 1 :(得分:0)

您还可以从公共文件中读取命令,并将输出和错误重定向到单独的文件。 Redirect.appendTo是为了避免进程覆盖现有日志。

试试这段代码:

try {
File commands = new File("D:/Sample/Commands.txt"); 
File output = new File("D:/Sample/Output.txt"); 
File errors = new File("D:/Sample/ErrorsLog.txt"); 

ProcessBuilder pb = new ProcessBuilder("cmd");

System.out.println(pb.redirectInput());
System.out.println(pb.redirectOutput());
System.out.println(pb.redirectError()); 

pb.redirectInput(commands);
pb.redirectError(Redirect.appendTo(errors));
pb.redirectOutput(Redirect.appendTo(output));

pb.redirectInput();
pb.redirectOutput();
pb.redirectError(); 

pb.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}