设置路径环境变量行为在Windows 10上有所不同

时间:2016-08-17 16:53:05

标签: java windows windows-10 processbuilder

我遇到的问题类似于此处发现的问题,但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环境变量不区分大小写,但如果我同时设置PATHPath,我会看到每个明确列在Windows 7和10的环境中。

2 个答案:

答案 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()的映射也区分大小写。记者希望两者是一致的(我也是)。