0

バッチ ファイルの終了コードと結果の環境をキャプチャできるソリューションが必要です。これは、システム環境とバッチ内で設定された変数を取得する必要があることを意味します。

よりよく理解するために、ここに私が思いついたものがあります。残念ながら、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
4

2 に答える 2

0

私は一種の解決策を見つけたと思います。完璧ではありませんが、何もないよりはましです。バッチ実行後に完全な環境を残すために、別のアプローチを使用して起動しました。

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);
    }    
}

コメントと代替ソリューションは大歓迎です。

于 2013-08-09T10:53:40.583 に答える
0

コードが終了する前に、これを試してください:-

Properties props = System.getProperties();
props.list(System.out);
于 2013-08-08T14:17:34.600 に答える