【问题标题】:Executing an external program with path variable set in Java?使用Java中设置的路径变量执行外部程序?
【发布时间】:2012-08-09 14:09:48
【问题描述】:

我希望通过命令行执行一个外部程序,但我发现只有在我调用它的目录中存在该程序时才能执行此操作。我希望能够从任何目录执行程序。

我已经为 windows (7) 设置了 Path 变量,并且能够使用命令行从任何目录手动执行程序;但是我无法通过 Java 做到这一点。

相关代码:

 Runtime rt = Runtime.getRuntime();

 Process proc = rt.exec(new String[]{"C:\\AutomateKPI\\GetLog.exe", "-e", rossIP});

我的问题是上述程序的输出产生了一个通用命名的文件“log.txt”。这将在线程化我的程序时导致问题。如果无法使用路径变量,或者我可以将程序复制到新目录中,然后将其删除。我想避免这样做。

编辑:上述代码的工作原理是 GetLog.exe 位于 C:\AutomateKPI 中。我想引用 %PATH% 以便我可以从 C:\AutomateKPI\*NewDir*

运行 GetLog.exe

【问题讨论】:

  • 你得到的错误是什么,也是c:\automateKPI目录下的GetLog.exe?
  • 我没有收到错误,但我想线程化我的程序并在各个目录中执行 GetLog.exe。 C:\AutomateKPI*NewDir*\GetLog.exe 无需将GetLog.exe复制到新创建的目录中
  • 是的,您的问题是您提供了 getlog.exe 的完整路径,但该路径中不存在该路径。您需要在实际路径中执行getlog.exe,然后提供一个工作目录。

标签: java variables path cmd external


【解决方案1】:

尝试使用ProcessBuilder。它允许您指定工作目录:

String commandPath = "C:" + File.pathSeparator +
                     AutomateKPI" + File.pathSeparator + "GetLog.exe";
ProcessBuilder pb = new ProcessBuilder(commandPath, "-e", rossIP);
pb.directory(new File("intendedWorkingDirectory"));
Process p = pb.start();

或者,如果 C:\AutomateKPI 在您的%PATH%:

ProcessBuilder pb = new ProcessBuilder("GetLog.exe", "-e", rossIP);

文档中并不清楚,但 ProcessBuilder 似乎以类似于系统的方式定位事物,例如在 Windows 上使用 %PATH%。

【讨论】:

  • 这是正确的吗?进程 proc = rt.exec(new String[]{"exec cmd /c GetLog.exe", "-e", rossIP})
  • 使用 ProcessBuilder,您可以设置/更改进程的环境变量。
  • @pb2q 您可以使用 File.pathSeperator 来构建路径是一种平台无关的方式。
  • 我会看看 ProcessBuilder。如果我想更改执行 GetLog.exe 的目录(使用 %PATH%),我可以执行以下操作吗? Process proc = rt.exec(new String[]{"cmd", "/c", "C:\\AutomateKPI\*NEWDIR*\\GetLog.exe", "-e", rossIP});请注意,%PATH% 当前设置为 GetLog.exe 所在的 C:\AutomateKPI。
  • @PeterLawrey 谢谢,ProcessBuilder 是更好的解决方案,似乎可以在 Windows 上按预期工作。
【解决方案2】:

好吧,只要你知道你正在打开的程序的路径,并且你不必使用 cmd,这应该每次都可以工作:

File file = new File("File Directory");
Desktop dt = Desktop.getDesktop();

try {
    dt.open(file);
} catch (IOException e1) {
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 2019-03-15
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 2012-03-22
    相关资源
    最近更新 更多