在Java中运行时设置Windows的PATH环境变量

6

我有一个Java程序,使用Runtime.exec()方法启动可执行文件。我使用的是将一组命令行参数作为一个参数和一些环境变量作为另一个参数的变体。

我想设置的环境变量是path,所以我传入了“PATH=C:\some\path”。但这并不起作用。是否有什么诀窍或替代方案。不幸的是,我被限制在Java 1.4上。

4个回答

7
使用 getenv 获取环境变量并进行修复,然后使用 exec 的一种方式来执行。
这适用于包含路径的批处理文件。
package p;

import java.util.*;

public class Run {
    static String[] mapToStringArray(Map<String, String> map) {
        final String[] strings = new String[map.size()];
        int i = 0;
        for (Map.Entry<String, String> e : map.entrySet()) {
            strings[i] = e.getKey() + '=' + e.getValue();
            i++;
        }
        return strings;
    }

    public static void main(String[] arguments) throws Exception {
        final Map<String, String> env = new HashMap<String, String>(System.getenv());
        env.put("Path", env.get("Path") + ";foo");
        final String[] strings=mapToStringArray(env);
        Runtime.getRuntime().exec("cmd /C start foo.bat",strings);
    }

}

这些都没有起作用。我认为你无法更改Windows PATH变量以便运行由Runtime.exec调用的进程。 - hhhh
在我的电脑上有效。如果我创建了一个名为foo的文件夹,并在其中放置一个名为bar.bat的文件,并将其exec更改为“cmd / C start bar.bat”,则可以在使用Windows 8.1上的1.6时从bar.bat看到消息。 - Ray Tayek

2
如果你的源代码中出现了“PATH=C:\some\path”,那么是不正确的,因为它会试图转义该字符串中的's'和'p',你应该使用"PATH=C:\\some\\path"(转义斜杠)。此外,你不应该直接将其作为字符串传递,而是作为一个字符串数组传递(可能只有这个字符串在其中)。

2
如果你想在Windows上更改路径变量,可以查看JNI_Registry:http://www.trustice.com/java/jnireg/。它是Windows注册表API的Java绑定,占用空间非常小。我已经在我的当前项目中使用它了,效果很好。

1

一个解决方案可能是在“exec”中添加一个额外的命令,设置路径...就像在此处找到的示例中一样: http://www.neowin.net/forum/topic/620450-java-runtimegetruntimeexec-help/

摘录:

            cmd = new String[7];
            cmd[0] = "cmd"; 
            cmd[1] = "/C";
            cmd[2] = "set PATH=C:\\Program Files\\Java\\jdk1.6.0_04\bin";
            cmd[3] = "copy " + "\"" +path + "\\" +name+ "\"" + " C:\\java";
            cmd[4] = "chdir C:\\java";
            cmd[5] = "javac *.java";
            cmd[6] = "jar cmf mainClass.txt"+" name"+".jar *.class";

            try{
            Runtime.getRuntime().exec(cmd);

可以。 - gumuruh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接