【问题标题】:java getenv Windows system environment variablejava getenv Windows系统环境变量
【发布时间】:2013-08-14 22:56:48
【问题描述】:

我有一个使用 System.getenv("MY_VAR") 获取系统环境变量的 JAVA 应用程序。有没有办法只搜索 Windows 系统环境变量而不是用户环境变量,类似于我们如何将环境变量目标传递给 C# Environment.GetEnvironmentVariable() 方法?任何帮助,将不胜感激。谢谢!

【问题讨论】:

  • 在 Windows 命令行中键入“SET”时看到的变量是使用“env”访问的。在前面。所以“PATH”应该是 System.getenv("env.PATH") 虽然我不记得你是否需要大写。

标签: java windows environment-variables


【解决方案1】:

在 Java 中没有办法做到这一点,至少本机没有(见下文)。

Windows 合并系统和用户环境变量并将合并后的环境传递给应用程序,而没有关于每个特定变量来自何处的信息。 C# 可以做到这一点,因为 C# 不是通过访问进程的环境来做到这一点,而是直接在注册表中访问系统环境配置。因此,它可以做出这种区分。 Java 只允许您直接访问与 C# 中的 Process 环境目标等效的对象。

现在,如果您真的很绝望,您可以从 Windows 注册表 just as C# does 中读取值。问题是 Java 不能直接访问注册表,您只能通过 Preferences API 访问有限的注册表项子集。要获得完全访问权限,您需要使用 JNI。

http://www.trustice.com/java/jnireg/ 有一个 JNI 注册表库。您可以使用它来读取 C# 使用的相同注册表项并访问相同的数据。

这里的要点是,C# 让您可以访问该信息,而不是通过实际的环境块,而是通过直接读取系统设置,而 Java 本身无法做到这一点。

【讨论】:

  • 谢谢!这是一个非常有用且完整的答案。
【解决方案2】:

当您的进程收到环境时,它已全部合并到一个键/值对列表中。将系统变量和用户变量分开是一种仅限于 Windows 的微妙之处,它不会传播到程序中……除非您编写不可移植的代码来直接读取 Windows 注册表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-29
    • 2015-08-20
    • 2015-09-12
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 2016-09-29
    相关资源
    最近更新 更多