[英]Invoke postgres commands via Java Runtime.getruntime.exec()
最初,我运行此代码时没有前导"cmd"
并且收到访问拒绝消息。 Postgres由无法登录的帐户作为服务运行,我是运行此应用程序的管理员。 包含"cmd"
的尝试未返回任何输入。 我的问题是如何执行这些语句来实现结果文件和数据更改?
String[] psqlCommands = {"cmd ",postgresLocation, " -dDatabase ", " -UUser ",
"-c ", "UPDATE host.user SET service = 1 WHERE service = 1;" +
"UPDATE host.permission SET service = 1 WHERE service = 2"};
Runtime.getRuntime().exec(psqlCommands);
String[] pgDumpCommands = {"cmd ", postgresLocation, " --data-only ",
"-t host.user_info -t host.permission -t host.group -t host.account -t host.password " +
"-UUser Database> "
+ DATA + "\\dataExport.sql"};
Runtime.getRuntime().exec(pgDumpCommands);
生成的异常是Postgres_Bin
目录上的“ Access Denied
异常。 一旦获得必要的材料,我将发布跟踪。
Exception in thread "main" java.io.IOException: Cannot run program "d:\\program f iles\\postgres\\bin": CreateProcess error=5, Access is denied
at java.lang.ProcessBuilder.start(Unknown Source) at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at Thing.main(Thing.java:85)
Caused by: java.io.IOException: CreateProcess error=5, Access is denied
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.<init>(Unknown Source)
at java.lang.ProcessImpl.start(Unknown Source)
... 4 more
首先,如果要在Windows Shell上下文中运行某些程序,则必须使用cmd /c
。 否则,您将只运行cmd本身。 这就是您什么都没得到的原因。
修复代码后,与未使用cmd时获得的访问权限完全相同,这是因为您似乎没有足够的权限。 解决问题的方法1.修复您的权限2.如果不可能,请尝试使用runas
命令以其他用户身份运行外部进程。
从该错误看来,您正在尝试运行目录,而不是附加“ psql”或“ pg_dump”来获取实际的可执行文件名称。
我也相信您不需要在一开始就包含“ cmd”,因此请尝试再次删除它。
java.io.IOException:无法运行程序“ d:\\ program files \\ postgres \\ bin”
此错误表明路径中的空格使exec()调用混乱(并且目录bin确实不是Windows可以运行的任何内容)
由于空格,请确保用双引号将.exe的完整路径括起来。
我认为与使用exec()相比,建议使用ProcessBuilder,因为您可以指定参数和程序以不同的参数运行,从而避免使用空格分隔路径名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.