我使用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 postgress
是psql
的一个自变量,但对于shell(在我们的例子中是cmd.exe
(,这是两个独立的自变量--U
和postgress
,所以我们应该将它们分别传递给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\使其识别\