从Java

时间:2018-11-27 18:34:31

标签: java batch-file runtime.exec

我们的java方法执行如下的批处理脚本:

String command = batchFilePath + File.separator + filename + " " + path;
logger.info("Command to be executed = " + command);
Process process = Runtime.getRuntime().exec(command);
logger.info("Batchfile execution has started");

我们遇到了批处理文件未执行的情况。但是,之前和之后的记录器语句均已正确记录。上面的代码段也在try catch块内,我们看到日志中没有记录任何异常。批处理文件将执行另一个.exe文件,该文件的输出将写入一个单独的文件,并且该文件也未生成。在批处理文件中,如果.exe执行失败但也没有错误,则我们有记录器语句。

有人可以帮助我们确定为什么批处理文件没有执行的原因,因为我们看不到任何错误或异常。

1 个答案:

答案 0 :(得分:1)

尝试一下。

This explains how to capture error and output for a started thread

您可以使用process.getErrorStream()从您的进程中获取错误响应。

您可以创建一个线程来不断读取该错误流,如下所示:

static class StreamGobbler extends Thread {
    InputStream is;
    String type;

    StreamGobbler(InputStream is, String type){
        this.is = is;
        this.type = type;
    }

    public void run() {
        try {
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line=null;
            while ((line = br.readLine()) != null)
                System.out.println(type + ">" + line);    
            } catch (IOException ioe) {
                ioe.printStackTrace();  
            }
    }
}

public static void main(String[] args){

     String command = batchFilePath + File.separator + filename + " " + path;
     logger.info("Command to be executed = " + command);
     Process process = Runtime.getRuntime().exec(command);
     logger.info("Batchfile execution has started");

     StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "ERROR");
     errorGobbler.start();
}