Il est surprenant que la commande que vous affichez fonctionne du tout, car vous ne parvenez pas à citer les espaces dans le chemin de la commande. Essayez :
String[] cmd = {
"D:\\Program Files\\PostgreSQL\\9.1\\bin\\pg_restore.exe",
"--host", "localhost",
"--port", "5432",
"--username", "postgres",
"--dbname", "mytestqq",
"--role", "postgres",
"--no-password",
"--verbose",
"D:\\sathish\\rawDatabase.backup"
};
p = r.exec(cmd);
Modifications :
- Convertissez la forme de chaîne unique en la forme de tableau d'arguments beaucoup plus sûre de
exec
appeler ; - Doublez les barres obliques inverses dans
rawDatabase
chemin puisque votre commande d'origine ne parvient pas à échapper les barres obliques inverses, donc\r
est un retour chariot dans la chaîne au lieu du\
caractère suivi dur
caractère. - Passez aux doubles barres obliques inverses au lieu des barres obliques dans le chemin du programme pour plus de cohérence. Ce changement n'a probablement pas d'importance.
Vérifiez également l'état de retour du processus. Vous devez utiliser Process.waitFor()
puis une fois qu'il est sorti, utilisez Process.exitValue()
pour déterminer le résultat. Vous devriez examiner les stderr et stdout capturés par le Process
objet pour les erreurs et les informations de journalisation.
La raison pour laquelle votre programme continue de ne pas fonctionner est probablement que :
- Vous avez l'ancien
pg_restore
processus suspendus tenant des verrous ; et/ou - Vous n'utilisez pas stdout et stderr donc
pg_restore
manque d'espace de canal tamponné et bloque l'écriture sur le flux de sortie.
Tout cela sera beaucoup plus simple si vous utiliser ProcessBuilder
à la place
. ProcessBuilder vous permet de fournir des flux de fichiers sur lesquels écrire la sortie et s'en occupe généralement pour vous. Vous devez toujours attendre que le processus se termine et vérifier son code de retour.