【问题标题】:Setting Path environment variable behavior differs on windows 10Windows 10 上的设置路径环境变量行为不同
【发布时间】:2016-08-17 16:53:04
【问题描述】:

我有一个与此处发现的问题相似的问题,但在 Windows 10 上的行为似乎有点不同:Setting the environment for ProcessBuilder

我想在ProcessBuilder 环境中设置Path 环境变量以发送到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 的环境中看到每个明确列出的变量。

【问题讨论】:

  • 您的意思是"C:\\test""C:\test"其实就是文字C:&lt;tab&gt;est
  • 无法重现。代码更新Path 环境变量在 Windows 7 和 Windows 10 上相同。
  • 是的,抱歉,这是一个错字,从原始来源转换为更小的来源。
  • 我会过滤环境以替换 PATH 的任何大写形式,而不是放置新的形式。或者至少在添加新路径之前先删除路径和路径。
  • Java 的 SDK 已经做到了这一点。见hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/windows/…

标签: java windows windows-10 processbuilder


【解决方案1】:

在您的 Java 应用程序中,Map 的键区分大小写。另一方面,环境变量名称不区分大小写。 ProcessBuilder.environment() 返回的 Map 将能够保留由“Path”和“PATH”键入的单独条目。列出 Map 的内容时,您可以看到两个单独的条目。但是,当创建 Windows 进程时,这两个条目之一将覆盖进程环境表中的另一个,因为变量的名称被认为是相同的。要查看它是否为路径创建了单个条目,您需要为 ProcessBuilder 提供命令列表 {"cmd","/c","SET"} 并查看进程的输出。

我不知道你为什么说这种行为在 Windows 7 和 10 之间有所不同。它不应该有任何区别。

【讨论】:

【解决方案2】:

https://bugs.openjdk.java.net/browse/JDK-8245431 似乎涵盖了这个问题,它谈到 ProcessBuilder.environment() 的映射是区分大小写的,即使 System.getenv() 不区分大小写。记者希望两者保持一致(我也是)。

【讨论】:

猜你喜欢
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
  • 2019-03-18
  • 1970-01-01
  • 2021-10-02
相关资源
最近更新 更多