読者です 読者をやめる 読者になる 読者になる

「Java」ProcessBuilderで環境変数を設定してバッチファイルを実行する

ProcessBuilder で環境変数を設定してバッチファイルを実行するサンプルのメモです。

といいましても、ProcessBuilder#environment で取得したマップに対して、設定したい環境変数を put してやるだけでいいみたいです。

ProcessBuilder (Java Platform SE 8 )
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/processbuilder.html

・ProcessBuilderTest.java

package process.builder;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Map;

public class ProcessBuilderTest {
	public static void main(String[] args) {
		ProcessBuilderTest pbs = new ProcessBuilderTest();

		ProcessBuilder pb = new ProcessBuilder("C:\\devspace\\workspace45\\ZZZ\\bat\\test.bat");
		Map<String, String> env = pb.environment();
		env.put("AAA", "aaa");
		pb.redirectErrorStream(true);
		try {
			Process p = pb.start();
			pbs.print(p.getInputStream());
			p.waitFor();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	private void print(InputStream is) throws IOException {
		try (BufferedReader br = new BufferedReader(new InputStreamReader(is));) {
			String line;
			while ((line = br.readLine()) != null) {
				System.out.println(line);
			}
		}
	}
}

・test.bat

@echo off
echo %AAA%
echo %JAVA_HOME%

・実行結果

aaa
C:\Program Files\Java\jdk1.8.0_92


システム環境変数(上の例では JAVA_HOME)は設定したくない場合は、Map#clear を呼び出しておけばいいみたいです。

・ProcessBuilderTest.java

 - 略 -
		ProcessBuilder pb = new ProcessBuilder("C:\\devspace\\workspace45\\ZZZ\\bat\\test.bat");
		Map<String, String> env = pb.environment();
		env.put("AAA", "aaa");
		pb.redirectErrorStream(true);
 - 略 -

・実行結果

aaa
ECHO は <OFF> です。


非常に簡単ですが、以上になります。

[環境情報]
Windows 10
Java SE 8 Update 92