【问题标题】:Java exec and environment variable in command path命令路径中的 Java exec 和环境变量
【发布时间】:2014-05-14 14:48:11
【问题描述】:

我尝试使用 Runtime.exec() 在命令字符串中使用环境变量执行参数化命令。

例子:

  String cmd = "%ProgramFiles%\\Internet Explorer\\iexplore.exe";
  Runtime.getRuntime().exec(cmd);

我收到以下错误:

java.io.IOException: Cannot run program "%ProgramFiles%\Internet": CreateProcess error=2, Le fichier spécifié est introuvable
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:460)
    at java.lang.Runtime.exec(Runtime.java:593)
    at java.lang.Runtime.exec(Runtime.java:431)
    at java.lang.Runtime.exec(Runtime.java:369)
    at TestEnv.main(TestEnv.java:34)
Caused by: java.io.IOException: CreateProcess error=2, Le fichier spécifié est introuvable
    at java.lang.ProcessImpl.create(Native Method)
    at java.lang.ProcessImpl.<init>(ProcessImpl.java:81)
    at java.lang.ProcessImpl.start(ProcessImpl.java:30)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:453)
    ... 4 more

命令中没有环境变量,它可以工作并启动 IE:

  String cmd = "C:\\Program Files\\Internet Explorer\\iexplore.exe";
  Runtime.getRuntime().exec(cmd);

我检查了 ProgramFiles 变量是否存在:

  String path = System.getenv("ProgramFiles");
  System.out.println(path);

这会很好地返回 C:\Program Files

我尝试手动输入变量,同样的错误:

  Runtime.getRuntime().exec(cmd, new String[] {"ProgramFiles=C:\\Program Files"});

我尝试使用 ProcessBuilder,同样的错误:

  ProcessBuilder pb = new ProcessBuilder(cmd);
  pb.start();

有什么好办法,可以吗?

【问题讨论】:

  • 你为什么不直接做String path = System.getenv("ProgramFiles"); String exe="iexplore.exe";Runtime.getRuntime().exec(path+"\\"+"exe");
  • 获取 %PROGRAMFILES% 的值并将后半部分附加到路径
  • 该命令在属性文件中定义并且是可修改的,因此我不能在这里使用连接。

标签: java environment-variables


【解决方案1】:

我不能直接谈论 Windows,但 exec 是直接查找命令路径并尝试运行它。将环境变量放在路径中并没有帮助,因为它是处理环境变量的外壳,而不是执行程序。

由于 JRE 与 Unix 操作系统非常相似,因此通常会使用两个 arg exec,其中一个 args 是 env vars。但是 java 没有选择启用该路由。

所以我的建议是将变量直接放入 JVM 环境中,然后执行命令。

或者其他人会跟进这篇文章的更多窗口。

【讨论】:

  • 因此尝试使用环境变量作为%VAR% 在Java 中永远不会像使用File("%PATH_TO%\\myfile") 打开文件那样有效
  • 是的,将 vars 作为命令放在某行是 shell 的一项功能,而不是 OS fork/exec 的一项功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 2020-11-06
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 2017-01-23
相关资源
最近更新 更多