Zaskakujące jest to, że polecenie, które pokazujesz, w ogóle działa, ponieważ nie cytujesz spacji w ścieżce poleceń. Wypróbuj:
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);
Zmiany:
- Konwertuj formę jednołańcuchową na znacznie bezpieczniejszą formę tablicy argumentów
exec
zadzwoń; - Podwój ukośniki odwrotne w
rawDatabase
ścieżka, ponieważ oryginalne polecenie nie ma ucieczki od ukośników odwrotnych, więc\r
jest znakiem powrotu karetki w ciągu zamiast\
znak, po którym następujer
znak. - Przełącz na podwójne ukośniki odwrotne zamiast ukośników do przodu w ścieżce programu, aby zachować spójność. Ta zmiana prawdopodobnie nie ma znaczenia.
Sprawdź również status zwrotu procesu. Musisz użyć Process.waitFor()
następnie po wyjściu użyj Process.exitValue()
aby określić wynik. Powinieneś sprawdzić stderr i stdout przechwycone przez Process
obiekt dla błędów i informacji o logowaniu.
Powodem, dla którego Twój program nadal nie działa, jest prawdopodobnie to, że:
- Masz stary
pg_restore
procesy kręcące się wokół zamków; i/lub - Nie używasz stdout i stderr, więc
pg_restore
zabraknie miejsca na buforowane potoki i blokuje zapis w strumieniu wyjściowym.
To wszystko będzie znacznie prostsze, jeśli użyj ProcessBuilder
zamiast tego
. ProcessBuilder umożliwia dostarczanie strumieni plików do zapisywania danych wyjściowych i ogólnie zajmuje się tym za Ciebie. Musisz jednak poczekać na zakończenie procesu i sprawdzić jego kod zwrotny.