【问题标题】:Execute batch files from JAVA and capture batch environment从 JAVA 执行批处理文件并捕获批处理环境
【发布时间】:2013-08-08 14:05:01
【问题描述】:

我需要一个允许捕获批处理文件退出代码和结果环境的解决方案 - 我的意思是我需要检索批处理中设置的系统环境 + 变量。

为了更好地理解这里是我想出的。不幸的是,printEnvironment() 方法不会打印出之前批量设置的变量 MyVar,而只会打印出系统变量。有没有办法在不更改批处理文件本身的情况下捕获“MyVar”?

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

class Main{
    public static void main(String[] args){
        String command = "C:/temp/varTest.bat";

        MyTask mt = new MyTask(command);
        mt.run();
    }
}

class MyTask implements Runnable{       
    private ProcessBuilder pb;
    private Process process;
    private int exitCode;
    private Map<String, String> env;

    private String command;

    public MyTask(String command){
        this.command = command;
    }

    public void run(){
        try {
            pb = new ProcessBuilder(command);
            process = pb.start();

            process.waitFor();
            exitCode = process.exitValue();     

        } catch (IOException e) {
            e.printStackTrace();        
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally{
            System.out.println("Execution finished! Exit code: " + exitCode);

            printEnvironment();
            process.destroy();

        }           
    }

    private void printEnvironment(){
        env = pb.environment();

        List<String> envKeys = new ArrayList<String>(env.keySet());
        Collections.sort(envKeys);

        for(String key : envKeys){
            System.out.println(key+" ==> "+env.get(key));
        }
    }
}

批处理文件代码:

set MyVar=VAL

【问题讨论】:

标签: java batch-file process system environment


【解决方案1】:

在您的代码退出之前尝试这样做:-

Properties props = System.getProperties();
props.list(System.out);

【讨论】:

    【解决方案2】:

    我想我找到了一种解决方案。不完美,但总比没有好。 为了在批处理执行后留下完整的环境,我使用了不同的方法来启动它。

    我只是在 cmd 中启动了批处理,这允许我将其他命令作为参数传递。接下来我必须从输出流中读取输出。 令我惊讶的是,我还能够从批处理中获得正确的退出代码 - 请注意,尽管我必须使用该子句:

    exit /B <exitCode> 
    

    这是对上面代码的修改:

    pb = new ProcessBuilder("cmd.exe", "/c", command, "&&set", "&&exit");
    process = pb.start();       
    pb.redirectErrorStream(true);
    
    process.waitFor();
    exitCode = process.exitValue();
    
    stdout = process.getInputStream ();
    stdOutReader = new BufferedReader (new InputStreamReader(stdout));
    

    ...

    String outLine;
    
    while ((outLine = stdOutReader.readLine ()) != null) {
        if(outLine.trim().length() > 0){
            System.out.println ("OUT STREAM: " + outLine);
        }    
    }
    

    欢迎任何 cmets 和替代解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-23
      • 2017-03-07
      • 1970-01-01
      • 1970-01-01
      • 2015-06-03
      • 2016-09-09
      • 2012-12-26
      • 1970-01-01
      相关资源
      最近更新 更多