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
execappeler ; - Doublez les barres obliques inverses dans
rawDatabasechemin puisque votre commande d'origine ne parvient pas à échapper les barres obliques inverses, donc\rest un retour chariot dans la chaîne au lieu du\caractère suivi durcaractè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_restoreprocessus suspendus tenant des verrous ; et/ou - Vous n'utilisez pas stdout et stderr donc
pg_restoremanque 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.