Вызовите команды postgres через Java Runtime.getruntime.exec () - PullRequest
0 голосов
/ 07 декабря 2010

Сначала я запустил этот код без начального "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<br> at java.lang.ProcessBuilder.start(Unknown Source) at java.lang.Runtime.exec(Unknown Source)<br> at java.lang.Runtime.exec(Unknown Source)<br> at Thing.main(Thing.java:85)<br> Caused by: java.io.IOException: CreateProcess error=5, Access is denied<br> at java.lang.ProcessImpl.create(Native Method)<br> at java.lang.ProcessImpl.<init>(Unknown Source)<br> at java.lang.ProcessImpl.start(Unknown Source)<br> ... 4 more

Ответы [ 3 ]

1 голос
/ 07 декабря 2010

Из ошибки похоже, что вы пытаетесь запустить каталог, а не добавляете "psql" или "pg_dump", чтобы получить фактическое имя исполняемого файла.

Я также считаю, что вам не нужно включать «cmd» в начале, поэтому попробуйте убрать его снова.

1 голос
/ 07 декабря 2010

java.io.IOException: не удается запустить программу "d: \ program files \ postgres \ bin"

Эта ошибка указывает на то, что пробелы в пути путают вызов exec () (и каталог bin действительно ничего не может запустить Windows)

Убедитесь, что вы заключили полный путь к .exe в двойные кавычки из-за пробелов.

Я думаю, что использование ProcessBuilder рекомендуется вместо использования exec (), поскольку вы можете указать аргументы и программу для запуска с различными параметрами, избегая экранирования имен путей с пробелами.

1 голос
/ 07 декабря 2010

Сначала, если вы хотите что-то запустить в контексте оболочки Windows, вы должны использовать cmd /c.В противном случае вы просто запускаете cmd.Это причина того, что вы ничего не получаете.

Когда вы исправляете свой код, ожидается, что вам будет отказано в доступе точно так же, как вы получили, когда вы не использовали cmd, потому что кажется, что у вас недостаточно прав.Для решения проблемы: 1. исправьте ваши права доступа 2. если это невозможно, попробуйте запустить внешний процесс от имени другого пользователя с помощью команды runas.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...