我遇到的问题类似于此处发现的问题,但Windows 10上的行为似乎有点不同:Setting the environment for ProcessBuilder
我想在Path
环境中设置ProcessBuilder
环境变量,以便发送到cmd /C
来电。
考虑:
if(platform.startsWith("Windows"))
{
cmd = "cmd";
command = new String[] {"/C", "prog.exe"};
}
String[] args = new String[]();
args.add(cmd);
args.add(command[0]);
args.add(command[1]);
ProcessBuilder pb = new ProcessBuilder(args);
Map<String, String> env = pb.environment();
// set environmental variables for libraries
if(platform.startsWith("Windows"))
{
env.put("Path", env.get("Path") + ";" + "C:\\test");
}
Process process = pb.start();
使用Path
是之前SO帖子中的建议,并且继续在Windows 7上运行,但是转移到Windows 10后,它不再找到prog.exe
。我不明白的是,如果我将env.put("Path"...
更改为env.put("PATH"...
,它现在可以正确找到prog.exe
。 Windows 10中的环境变量是否已更改?我还认为Windows环境变量不区分大小写,但如果我同时设置PATH
和Path
,我会看到每个明确列在Windows 7和10的环境中。
答案 0 :(得分:1)
在Java应用程序中,Map的键区分大小写。另一方面,环境变量名称不区分大小写。 ProcessBuilder.environment()
返回的地图将能够保留由“路径”和“路径”键入的单独条目。列出Map的内容时,您可以看到两个单独的条目。但是,在创建Windows进程时,这两个条目中的一个将覆盖进程环境表中的另一个,因为变量的名称被认为是相同的。要查看它已为路径创建了单个条目,您需要为ProcessBuilder提供命令列表{“cmd”,“/ c”,“SET”}并查看该过程的输出。
我不确定为什么你说这种行为在Windows 7和10之间有所不同。它应该没有任何区别。
答案 1 :(得分:1)
https://bugs.openjdk.java.net/browse/JDK-8245431似乎解决了这个问题,该问题谈到即使System.getenv()不区分大小写,ProcessBuilder.environment()的映射也区分大小写。记者希望两者是一致的(我也是)。