【问题标题】:ProcessBuilder can't find custom .exeProcessBuilder 找不到自定义 .exe
【发布时间】:2021-06-11 11:35:30
【问题描述】:

我目前正在尝试用 java 编写一个小程序,它应该接管我一直在使用的旧批处理脚本的工作。

此批处理脚本执行一个名为 sum.exe(Supermicro 更新管理器)的程序。

但是,无论我尝试哪种方式,程序要么没有响应,要么直接告诉我在文件所在的目录中找不到文件。

    boolean isWindows = System.getProperty("os.name").toLowerCase().startsWith("windows");
    ProcessBuilder builder = new ProcessBuilder("C:\\Users\\[Username]\\SUM\\sum.exe");
    if (isWindows) {
        builder.command("sum.exe", "-i 192.168.4.10 -u ADMIN -p ADMIN -c CheckOOBSupport");
    } else {
        builder.command("sh", "-c", "ls");
    }
    builder.redirectErrorStream(true);
    Process process = builder.start();
    StreamGobbler streamGobbler = new StreamGobbler(process.getInputStream(), System.out::println);
    StreamGobbler streamGobblerErrors = new StreamGobbler(process.getErrorStream(), System.out::println);
    Executors.newSingleThreadExecutor().submit(streamGobbler);
    Executors.newSingleThreadExecutor().submit(streamGobblerErrors);
    int exitCode = process.waitFor();
    assert exitCode == 0;

这是我目前拥有的代码。我在此处尝试调用的命令将 100% 出错,因此我确保也将它们重定向。

据我了解,有 3 种不同的方法可以为 Processbuilder 设置文件路径。 无论是你:

  1. 在构造函数中设置路径
  2. 在 .command() 方法中设置可执行文件和参数之间的路径
  3. 或者您通过创建一个新文件(并使用 System.Property)来设置构建器的目录

我在C:\Users\[Username]\SUM 下有一个 SUM 文件夹的完整副本,我已经尝试了上面列出的所有 3 个选项,但总是收到系统找不到指定文件的错误消息 此外,我仍然不确定该命令是否会以这种方式工作。我只通过批处理脚本或 cmd.exe 本身使用过 sum.exe,所以不需要该命令

builder.command("cmd.exe", "sum.exe -i 192.168.4.10 -u ADMIN -p ADMIN -c CheckOOBSupport)

改为?

谁能告诉我我做错了什么? 谢谢!

【问题讨论】:

    标签: java processbuilder


    【解决方案1】:

    ProcessBuilder 命令行在构造函数或command() 方法中传递,因此在您的示例中,您已经覆盖了使用的值。

    选择您需要的方式:

    ProcessBuilder builder = new ProcessBuilder("C:\\Users\\[Username]\\SUM\\sum.exe",
            "-i", "192.168.4.10", 
            "-u", "ADMIN","-p", "ADMIN",
            "-c", "CheckOOBSupport");
    

    ProcessBuilder builder = new ProcessBuilder();
    builder.command("sum.exe", 
            "-i", "192.168.4.10", 
            "-u", "ADMIN","-p", "ADMIN",
            "-c", "CheckOOBSupport");
    

    另请注意,命令的参数需要作为单独的字符串值提供,而不是全部连接在一起作为一个值,如果在当前目录或目录下找不到“sum.exe”的绝对路径,则需要环境变量“Path”的目录。

    【讨论】:

    • 非常感谢!使用您发布的第二个选项并将 sum.exe 复制到 src 文件夹中终于让它工作了!
    猜你喜欢
    • 2015-03-28
    • 1970-01-01
    • 2020-08-07
    • 2015-11-12
    • 2023-03-04
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多