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 设置文件路径。
或者你:
- 在构造函数中设置路径
- 在 .command() 方法中设置可执行文件和参数之间的路径
- 或者您通过创建一个新文件(并使用 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”的目录下。
我目前正在尝试在 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 设置文件路径。 或者你:
- 在构造函数中设置路径
- 在 .command() 方法中设置可执行文件和参数之间的路径
- 或者您通过创建一个新文件(并使用 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”的目录下。