gpt4 book ai didi

java - 通过 Java ProcessBuilder 运行命令与在 Shell 中运行命令不同

转载 作者:太空宇宙 更新时间:2023-11-04 08:54:35 24 4
gpt4 key购买 nike

我正在绞尽脑汁地试图找出为什么我使用 ProcessBuilder & Process 通过 Java 执行的命令不起作用。我在 Windows 命令行中运行“相同”命令,它按预期工作。它们一定是不一样的,但我一辈子也无法找出原因。

命令是这样的:

ccm start -nogui -m -q -n ccm_admin -r developer -d /path/to/db/databasename -s http://hostname:8400 -pw Passw0rd789$

输出应该是一个单行字符串,我需要获取它并将其设置为环境变量(因此是 BufferedReader 的 v. 基本使用)。

我的 Java 代码在运行命令时出现应用程序错误,看起来像这样,入口点为 startCCMAndGetCCMAddress():

private static String ccmAddress = "";

private static final String DATABASE_PATH = "/path/to/db/databasename";
private static final String SYNERGY_URL = "http://hostname:8400";

private static final String USERNAME = "ccm_admin";
private static final String PASSWORD = "Passw0rd789$";
private static final String USER_ROLE = "developer";


public static List<String> getCCMStartCommand() {
List<String> command = new ArrayList<String>();

command.add("cmd.exe");
command.add("/C");

command.add("ccm");
command.add("start");
command.add("-nogui");
command.add("-m");
command.add("-q");
command.add("-n "+USERNAME);
command.add("-r "+USER_ROLE);
command.add("-d "+DATABASE_PATH);
command.add("-s "+SYNERGY_URL);
command.add("-pw "+PASSWORD);

return command;
}

private static String startCCMAndGetCCMAddress() throws IOException, CCMCommandException {
int processExitValue = 0;

List<String> command = getCCMStartCommand();

System.err.println("Will run: "+command);

ProcessBuilder procBuilder = new ProcessBuilder(command);
procBuilder.redirectErrorStream(true);
Process proc = procBuilder.start();
BufferedReader outputBr = new BufferedReader(new InputStreamReader(proc.getInputStream()));

try {
proc.waitFor();
} catch (InterruptedException e) {
processExitValue = proc.exitValue();
}

String outputLine = outputBr.readLine();
outputBr.close();

if (processExitValue != 0) {
throw new CCMCommandException("Command failed with output: " + outputLine);
}

if (outputLine == null) {
throw new CCMCommandException("Command returned zero but there was no output");
}

return outputLine;

}

System.err.println(...) 的输出是:

Will run: [cmd.exe, /C, ccm, start, -nogui, -m, -q, -n ccm_admin, -r developer, -d /path/to/db/databasename, -s http://hostname:8400, -pw Passw0rd789$]

最佳答案

我认为您需要单独提供每个参数,并且没有前导/尾随空格,而不是连接选定的参数,例如“-pw PASSWORD”。这样您就可以使用正确的参数集调用该进程(就像从命令行看到的那样)

关于java - 通过 Java ProcessBuilder 运行命令与在 Shell 中运行命令不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2577507/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com