"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 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 + "\"");
我使用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 benull
-- this means to use the working directory of the current Java process, usually the directory named by the system propertyuser.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 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 + "\"");