我正在尝试使用processbuilder运行连接到数据库的EXE程序。在我的windows配置中,defaut环境变量是username的“paul”,但是连接到数据库的用户应该是“postgres”。
我可以在windows 10的“命令窗口”中运行此命令:c:\program files\bin\ogr2ogr.exe-f“esri shapefile”c:\temp\mydata.shp pg:“host=127.0.0.1 user=postgres dbname=mydbname password=mypassword”“mytable”
在java中,我尝试这样做:
Public void exec(){
command = new String[] {C:\\Program Files\\bin\\ogr2ogr.exe",
"-f", "\"ESRI Shapefile\"",
"C:\\Temp\\mydata.shp",
"PG:\"host="127.0.0.1 user=postgres dbname=mydbname password=mypassword\"",
"\"mytable\""};
ProcessBuilder pb = new ProcessBuilder(command);
pb.redirectErrorStream(true);
pb.environment().remove("USERNAME");
pb.environment().put("USERNAME", "postgres");
Process p = pb.start();
BufferedReader bufIn = new BufferedReader(new InputStreamReader(p.getInputStream()));
String str1 = null;
while ((str1= bufIn.readLine()) != null) {
textOutput.append(str1 + "\n");
System.out.println(str1 + "\n");
}
}
当我调试并检查processbulider pb的环境变量时,在pb.start()之前,我可以看到username=postgres
我得到的输出是:错误1:pqconnectdb失败。致命:角色“保罗”不存在
如果有人能告诉我我做错了什么,我会很感激的。谨致问候,保罗
2条答案
按热度按时间rbl8hiat1#
根据
是否重写windows环境变量值?
用户名不能这么容易被覆盖。。。
你的代码很好,但是用户名在windows上有点特殊,否则你可以用系统上的任何用户运行你的应用程序
uemypmqf2#
如果改用process:process process=runtime.getruntime().exec(新字符串[]{“cmd.exe”,“/c”,c:\progra~1\bin\ogr2ogr.exe-f“esri shapefile”“c:\temp\mydata.shp”“pg:”host=127.0.0.1 user=postgres password=mypassword dbname=mydbname”“mytable”});
效果不错!!!但是我必须使用路径的简称:c:\ProgramFiles,这在使用processbuilder时是不必要的。。。。我想知道有什么不同?