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

通过Java Runtime.getruntime.exec()调用postgres命令,java,sql,postgresql,Java,Sql,Postgresql,最初,我在运行此代码时没有使用前导的“cmd”,并收到一条拒绝访问的消息。Postgres是由一个无法登录的帐户作为服务运行的,我是运行此应用程序的管理员。包含“cmd”的尝试不会返回任何输入。我的问题是如何执行这些语句以实现结果文件和数据更改 String[] psqlCommands = {"cmd ",postgresLocation, " -dDatabase ", " -UUser ", "-c ", "UPDATE host.user SET se

最初,我在运行此代码时没有使用前导的
“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\u Bin
目录中。一旦我得到了必要的材料,我会发布一个跟踪

线程“main”java.io.IOException中的异常:无法运行程序“d:\program f iles\postgres\bin:CreateProcess错误=5,访问被拒绝
位于java.lang.ProcessBuilder.start(未知源) 在java.lang.Runtime.exec(未知源代码)
在java.lang.Runtime.exec(未知源代码)
at Thing.main(Thing.java:85)
原因:java.io.IOException:CreateProcess错误=5,访问被拒绝
在java.lang.ProcessImpl.create(本机方法)
位于java.lang.ProcessImpl.(未知源)
在java.lang.ProcessImpl.start(未知源)

... 4更多

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

当修复代码时,由于您似乎没有足够的权限,您将被拒绝访问,就像您没有使用cmd时一样。解决问题 1.修复您的权限
2.如果不可能,请尝试使用
runas
命令以不同的用户身份运行外部进程。

首先,如果要在windows shell的上下文中运行某些内容,必须使用
cmd/c
。否则,您只是在运行cmd本身。这就是你什么也得不到的原因

当修复代码时,由于您似乎没有足够的权限,您将被拒绝访问,就像您没有使用cmd时一样。解决问题 1.修复您的权限
2.如果不可能使用
runas
命令以不同的用户身份运行外部进程。

从错误中可以看出,您试图运行目录,而不是附加“psql”或“pg_dump”以获取实际的可执行文件名


我还认为您不需要在开始处包含“cmd”,所以请再次尝试将其删除。

从错误中可以看出,您试图运行目录,而不是附加“psql”或“pg_dump”以获得实际的可执行文件名

我也相信你不需要在开头加上“cmd”,所以再试试把它去掉

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

此错误表示路径中的空格混淆了exec()调用(并且目录bin实际上是Windows无法运行的)

由于存在空格,请确保使用双引号将.exe的完整路径括起来

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

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

此错误表示路径中的空格混淆了exec()调用(并且目录bin实际上是Windows无法运行的)

由于存在空格,请确保使用双引号将.exe的完整路径括起来


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

cmd不需要,您是否可以发布一些异常或错误消息,如果访问被拒绝,我要强调的是,在我的postAccess Denied似乎是非常通用的错误消息中,更多详细信息将非常有用,此外,我建议您将查询绑定到sql文件并转储,我将立即返回完整跟踪。您试图执行什么?什么是
postgresLocation
?一些参数对
psql
有效,其他参数对
pg_dump
有效,但我看不出您在哪里提到了合适的工具。但鉴于“拒绝访问”消息,我认为您试图转储到您无权访问的目录。不需要cmd,您是否可以发布一些异常或错误消息?如果访问被拒绝,我将强调,在我的“拒绝访问后”错误消息中,更多详细信息将非常有用,此外,我建议您将查询绑定到sql文件中并转储,我将立即返回完整的跟踪。您想执行什么?什么是
postgresLocation
?一些参数对
psql
有效,其他参数对
pg_dump
有效,但我看不出您在哪里提到了合适的工具。但是由于“访问被拒绝”的消息,我相信你正在试图转储到一个你无权访问的目录。亲爱的亲爱的jeebus我不敢相信我错过了亲爱的jeebus我不敢相信我错过了