【问题标题】:Why can I set a path in the command prompt but not my program?为什么我可以在命令提示符中设置路径而不是我的程序?
【发布时间】:2011-07-06 13:21:03
【问题描述】:

我想用这个 Windows 命令在我的 Java 程序中设置一个路径(这个路径包含一些在我的程序的本地外围设备中使用的 DLL 文件):

c:\>path=%path%;"C:\Users\NetBeansProjects\IPTV1.7\3rd_party"

但这会导致程序运行时出现异常:

java.io.IOException: Cannot run program "path=%path%;C:\Users\NetBeansProjects\IPTV1.7\3rd_party\": CreateProcess error=2, 系统找不到指定的文件

我不知道为什么我可以在命令提示符下设置路径没有问题,然后在代码中抛出异常。

String path = "C:\\Users\\NetBeansProjects\\IPTV1.7\\3rd_party\\";
Runtime rt = Runtime.getRuntime();
Process p = rt.exec("path=%path%;"+ path);

【问题讨论】:

  • 当你说原生外设时,你是什么意思?在某些时候,您正试图从您的 java 程序中启动另一个进程,而您想要做的是控制启动的进程获得的路径?

标签: java path


【解决方案1】:

你的命令

path=%path%;"C:\Users\NetBeansProjects\IPTV1.7\3rd_party"

不是“真正的”windows 命令,而只是一个变量赋值,由您的 shell (cmd.exe) 解释,仅在同一个 shell 会话和从那里启动的任何命令(其他程序)中可见。

当尝试使用 Runtime.exec() 从 Java 执行此操作时,windows CreateProcess 函数会尝试查找具有此奇怪名称的可执行文件,该名称显然不存在(我认为不存在),然后您会得到这个错误。

即使您可以执行此操作,例如通过调用 cmd.exe,它也只会影响同一个 cmd.exe 进程(以及从那里启动的任何程序,而不是您自己的 Java 进程(以及从这里启动的程序)。

根据您的实际需求,您可以,例如:

  • 使用 ProcessBuilder 将路径直接提供给实际上需要它的进程(如 Aaron 所示)
  • 自己搜索可执行文件,如果你想在下一个exec中查找命令
  • 将变量赋值和其他命令放在一个 .BAT 或 .CMD 文件中并执行。

【讨论】:

    【解决方案2】:

    您可以在 java 中使用ProcessBuilder 来生成一个进程并控制它所获得的环境。因此,您将使用 ProcessBuilder 环境方法来设置 PATH 环境变量,然后设置相关的命令行,然后启动。所以类似(未尝试):

        ProcessBuilder b = new ProcessBuilder();
        b.environment().put("PATH", whatever);
        b.command(whatever);
        Process p = b.start();
    

    【讨论】:

    • 感谢您的宝贵建议。我设置了一个bat文件。
    【解决方案3】:

    当您在命令提示符下键入它时,cmd 程序会处理它并为您更改 PATH 变量。当您使用Runtime 尝试此操作时,不会创建cmd 进程,并且您的硬盘上也没有命令“path=%path%;C:\Users\NetBeansProjects\IPTV1.7\3rd_party\”(Windows 实际上会尝试查找具有此确切名称的程序)。

    将命令放在.BAT.CMD 文件中。 Windows 会自动创建一个cmd 进程来为您执行它们。

    【讨论】:

    • 感谢您的宝贵建议。我设置了一个bat文件。
    猜你喜欢
    • 2012-02-15
    • 1970-01-01
    • 2020-07-11
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    相关资源
    最近更新 更多