"Program Files" 找不到 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 PostgreSQL9.3binpsql.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

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

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

C:\PROGRA~1包含:C:\Program Files

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

设置此流程生成器的工作目录。随后由该对象的start()方法启动的子进程将使用此作为其工作目录。参数可能是null——这意味着使用当前Java进程的工作目录,通常是由系统属性user.dir命名的目录,作为子进程的工作路径。

将您的代码更改为:

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));
.....
如果要运行单独的二进制程序,请不要运行cmd.exe
cmd.exe用于*.cmd*.bat 等脚本

使用cmd.exe,您必须将您的命令作为CMD的参数进行传递,并且您应该管理所有特定于操作系统的陷阱,如带有空格的长路径、qoutes内的引号等。

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

注意参数列表——shell通过空格分隔参数,而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 + """);

您可以尝试的是,程序和文件之间的空间不是%20或\s。就像:

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

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

我希望其中一个对你有效,请让我知道

EDIT:使用double\使其识别\

最新更新