Запуск pg_dump из ShellExecuteEx ()

Когда я пытаюсь выполнить pg_dump.exe с ShellExecuteEx (), он возвращает код выхода 1 (сбой), и я думаю, что я могу не заметить простую ошибку, которую я сделал.

Вот командная строка, которая работает в командной строке:

"C:\Program Files\PostgreSQL\9.6\bin\pg_dump.exe" --host=localhost --port=5432 --username=journaluser Journal > "C:\Google Drive\Journal\Journal20170907203244973.backup"

Файл резервной копии создается с правильным содержимым.

А вот содержимое структуры SHELLEXECUTEINFO:

SHELLEXECUTEINFO see = { 0 };
see.cbSize = sizeof(SHELLEXECUTEINFO);
see.fMask = SEE_MASK_NOCLOSEPROCESS;
see.hwnd = NULL;
see.lpVerb = L"open";
see.lpFile = L"C:\\Program Files\\PostgreSQL\\9.6\\bin\\pg_dump.exe";
see.lpParameters = L" --host=localhost --port=5432 --username=journaluser Journal > \"\"\"C:\\Google Drive\\Journal\\Journal20170907203244973.backup\"\"\"";
see.lpDirectory = NULL;
see.nShow = SW_SHOWNORMAL;
see.hInstApp = NULL;

Дополнительные цитаты в lpParameters, потому что Microsoft говорит в https://msdn.microsoft.com/en-us/library/windows/desktop/bb759784(v=vs.85).aspx : «Чтобы включить двойные кавычки в lpParameters, заключите каждую метку в пару кавычек, как в следующем примере …»

Вызовы ShellExecuteEx () завершаются успешно, но код выхода равен 1, а файл .backup не создается.

Я пробовал различные формы вызова с кавычками и без них, и я пробовал CreateProcess (), но результаты одинаковы — код выхода 1 и нет файла резервной копии.

Я также пытался использовать Cmd.exe в качестве программы, с параметром «/ K (и т. Д.)», Но это не сработало.

Я пропустил что-то простое?

Благодарю.

9/8 Редактирование: И я забыл упомянуть, что SetEnvironmentVariable () используется для установки PGPASSWORD перед вызовом ShellExecuteEx (). Во время тестирования я использовал GetEnvironmentVariable (), чтобы убедиться, что значение было там.

Редактировать 2: Я попробую предложение Артемия. В то же время я создал файл паролей в соответствии с https://www.postgresql.org/docs/current/static/libpq-pgpass.html, но это не имело значения. (И для ясности я добавил пропущенную букву «L» в lpParameters.)

Редактировать 3: Как предложил Артемий, я написал программу, которая будет вызываться вместо pg_dump. Он просто записывает параметры командной строки, которые pg_dump обычно получает в файл, и завершает работу. Вот результаты (без сюрпризов; имя файла резервной копии отличается, потому что он динамически создается из даты и времени):

0: C:\dev\Applications\ParamTest\x64\Release\ParamTest.exe
1: --host=localhost
2: --port=5432
3: --username=journaluser
4: Journal
5: >
6: C:\Google Drive\Journal\Journal20170908093402258.backup
7: Environment password is 'qr71psgk'

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

Редактировать 4: я обошел проблему, создав пакетный файл, который принимает параметры и вызывает pg_dump. Это работает, но я все еще хотел бы знать, что пошло не так с другим подходом.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]