我有一个要求,我需要在Windows操作系统上运行需要环境变量值的命令。我尝试使用
Process p = Runtime.getRuntime().exec("cmd.exe","/c","setx","ENVVAR","somevalue");
p=Runtime.getRuntime().exec("cmd.exe","/c","COMMANDTHATUSEENVAR");
虽然已设置此ENVVAR,但运行时的下一个命令会给出错误,但未设置ENVAR。现在,当我重新启动工作区并运行上面的代码时,它很高兴地获取了ENVAR值。但问题是我每次都无法重新启动工作区。那么有没有任何可能的解决方案,我可以设置环境变量并使用该值而无需重新启动我的工作区。
答案 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 \"\" \"COMMANDTHATUSEENVAR\""
);
pb.environment().put("ENVVAR", "This is a test");
Process p = pb.start();
}
}