"Program Files" 未找到命令实习生 CMD

"Program Files" command intern not found CMD

我使用java执行命令行来创建数据库,当我执行这段代码时出现错误:

private final String POSTGRES_PATH = "\"C:\Program Files\PostgreSQL\9.3\bin\psql.exe\"";
private final String DATA_BASE = "bd_name";

private void creerDataBase() {
    String command = this.POSTGRES_PATH + " -U postgres -d postgres -c \"CREATE DATABASE " + this.DATA_BASE + "\"";
    System.out.println("command = " + command);
    String creerBDD = executerCommande(command);
    System.out.println("Resultat : " + creerBDD);
}

public String executerCommande(String command) {
    String line;
    String resultat = "";
    try {
        ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", command);
        builder.redirectErrorStream(true);
        Process p = builder.start();
        BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
        while (true) {
            line = r.readLine();
            if (line == null) {
                break;
            }
            resultat += line + "\n";
        }
    } catch (Exception e) {
        System.out.println("Exception = " + e.getMessage());
    }
    return resultat;
}

我得到这个结果:

command = "C:\Program Files PostgreSQL.3\bin\psql.exe"\ -U postgres -d postgres -c "CREATE DATABASE bd_name"

和这个错误:

'C:\Program' n'est pas reconnu en tant que commande interne

这意味着程序不是实习生命令。

但是当我在 CMD 中执行这个命令时它工作正常吗?

有什么方法可以构建此路径,因为 ProcessBuilder 无法识别 C:\Program Files

您可以尝试将程序和文件之间的 space 改为 %20 或 \s。 所以喜欢:

command = "C:\Program%20Files\PostgreSQL\9.3\bin\psql.exe"

command = "C:\Program\sFiles\PostgreSQL\9.3\bin\psql.exe"

我希望其中之一对你有用,请告诉我

编辑:使用双 \ 让它识别 \

一个可能的解决方案是从常量字段中删除路径(带空格)并使用 directory 方法:

Sets this process builder's working directory. Subprocesses subsequently started by this object's start() method will use this as their working directory. The argument may be null -- this means to use the working directory of the current Java process, usually the directory named by the system property user.dir, as the working directory of the child process.

将您的代码更改为:

private final String POSTGRES_DIR = "C:\Program Files\PostgreSQL\9.3\bin\"
private final String POSTGRES_COMMAND = "psql.exe";

....

ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", command).directory(new File(POSTGRES_DIR));
.....

感谢@Aaron,他的想法对我很有帮助,所以我用这个解决了这个问题:

private final String POSTGRES_PATH = "C:\PROGRA~1\PostgreSQL\9.3\bin\psql.exe";

C:\PROGRA~1 与此相关:C:\Program Files

如果你想运行一个单独的二进制程序,不要运行cmd.exe
cmd.exe 适用于 *.cmd*.bat

等脚本

使用 cmd.exe 时,您必须将命令作为 CMD 的参数传递,并且您应该管理所有 OS 特定的陷阱,例如带有空格的长路径、qoutes 中的引号等

相反,你最好 运行 psql 本身。
ProcessBuilder 将命令和所有参数作为单独字符串的列表。 ProcessBuilder 足够聪明,可以自行完成所有必要的引号和空格魔术。

并注意参数列表 - shells 用空格分隔参数,而 psql 可能将字符串序列识别为单个参数。
我们可以假设 -U postgresspsql 的单个参数,但对于 shell(在我们的例子中是 cmd.exe),这是两个单独的参数 - -Upostgress,所以我们应该将它们分别传递给 ProcessBuilder

所以 运行 psql 的更好方法是直接 运行 它,像这样:

 new ProcessBuilder("C:\Program Files\PostgreSQL\9.3\bin\psql.exe", 
                    "-U", "postgres", 
                    "-d", "postgres", 
                    "-c", "\"CREATE DATABASE " + this.DATA_BASE + "\"");