如何从java代码设置环境变量并使用此变量而不重新启动我的工作区

时间:2017-02-08 07:13:33

标签: java windows cmd environment-variables

我有一个要求,我需要在Windows操作系统上运行需要环境变量值的命令。我尝试使用

Process p = Runtime.getRuntime().exec("cmd.exe","/c","setx","ENVVAR","somevalue");
p=Runtime.getRuntime().exec("cmd.exe","/c","COMMANDTHATUSEENVAR");

虽然已设置此ENVVAR,但运行时的下一个命令会给出错误,但未设置ENVAR。现在,当我重新启动工作区并运行上面的代码时,它很高兴地获取了ENVAR值。但问题是我每次都无法重新启动工作区。那么有没有任何可能的解决方案,我可以设置环境变量并使用该值而无需重新启动我的工作区。

2 个答案:

答案 0 :(得分:2)

您可以尝试/ V选项,并尝试构建单个命令,如下面的example

cmd /V /C "set EDITOR=vim&& echo !EDITOR!"

所以我的建议是:首先构建一个在命令行上执行所需操作的字符串。然后将其转换为适用于Java ProcessBuilder的内容。

或者:您可以创建一个简单的批处理脚本,将ENVAR值作为参数;设置ENVAR,然后运行你的工具。

最后,您的问题是ProcessBuilder将 fork 一个新进程;所以"变化"你以后在另一个进程分叉时可以看到 not 。当您重新启动eclipse时,它会在完全 new 进程中运行,该进程会查看您的第一次系统调用所做的更新。

答案 1 :(得分:2)

默认情况下,environemnt块从父进程复制到子进程,但您可以更改启动进程的环境副本。

public class EnvironmentTest
{
    public static void main(String[] args) throws Exception
    {
        ProcessBuilder pb = new ProcessBuilder(
            "CMD.exe"
            , "/C"
            , "start \"\" cmd /c \"set e & pause\""
        );
        pb.environment().put("ENVVAR", "This is a test");
        Process p = pb.start();
    }
}

cmd内启动的ProcessBuilder实例已定义了环境变量。要显示它,此实例将启动另一个(start "" cmd ...)以在屏幕中显示变量中的值。

可能在你的情况下,你需要像

这样的东西
public class EnvironmentTest
{
    public static void main(String[] args) throws Exception
    {
        ProcessBuilder pb = new ProcessBuilder(
            "CMD.exe"
            , "/C"
            , "start \"\" \"COMMANDTHATUSEEN‌​VAR\""
        );
        pb.environment().put("ENVVAR", "This is a test");
        Process p = pb.start();
    }
}