ProcessBuilder 找不到自定义 .exe

ProcessBuilder can't find custom .exe

我目前正在尝试在 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)

代替?

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

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”的目录下。