通过Java Runtime.getruntime.exec()调用postgres命令

时间:2010-12-07 13:20:54

标签: java sql postgresql

最初我在没有前导"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);

生成的异常是Access Denied目录上的Postgres_Bin异常。一旦我得到必要的材料,我会发布一条痕迹。

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

3 个答案:

答案 0 :(得分:1)

首先,如果你想在windows shell的上下文中运行某些东西,你必须使用cmd /c。否则你只是运行cmd本身。这就是你没有得到任何东西的原因。

修复代码时,由于您似乎没有足够的权限,因此您需要完全取消访问权限。解决问题 1.修复你的权限 2.如果不可能尝试使用runas命令以不同的用户身份运行外部进程。

答案 1 :(得分:1)

从错误中看起来你正在尝试运行目录,而不是附加“psql”或“pg_dump”来获取实际的可执行文件名。

我也相信你不需要在开头包含“cmd”,所以再试一次。

答案 2 :(得分:1)

  

java.io.IOException:无法运行程序“d:\ program files \ postgres \ bin”

此错误表示路径中的空格混淆了exec()调用(目录 bin 实际上并不是Windows可以运行的任何内容)

请确保由于空格而用双引号括起.exe的完整路径。

我认为建议使用ProcessBuilder而不是使用exec(),因为您可以使用不同的参数指定参数和程序,避免使用空格转义路径名。