コマンドパスのスペースを引用符で囲まないため、表示するコマンドがまったく機能するのは驚くべきことです。試してみてください:
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);
変更点:
- 単一文字列形式を
exec
のはるかに安全な引数配列形式に変換します 電話; -
rawDatabase
の円記号を2倍にします 元のコマンドは円記号をエスケープできないため、パス。\ r
\
ではなく文字列のキャリッジリターンです charの後にr
が続く char。 - 一貫性を保つために、プログラムパスでスラッシュではなく円記号を2つに切り替えます。この変更はおそらく問題ではありません。
また、プロセスの戻りステータスも確認してください。 Process.waitFor()
終了したら、 Process.exitValue()
結果を決定します。 Process
によってキャプチャされたstderrとstdoutを調べる必要があります エラーとログ情報のオブジェクト。
プログラムが引き続き機能しない理由は、おそらく次の理由によるものです。
- 古い
pg_restore
があります ロックを保持するためにぶら下がっているプロセス。および/または - stdoutとstderrを消費していないので、
pg_restore
バッファリングされたパイプスペースが不足し、出力ストリームへの書き込みがブロックされます。
ProcessBuilder
を使用する 代わりに
。 ProcessBuilderを使用すると、出力を書き込むためのファイルストリームを提供でき、通常、これを多く処理します。ただし、プロセスが終了するのを待って、戻りコードを確認する必要があります。