2012-03-19 31 views
0

javaから「VACUUM VERBOSE」コマンドを実行しようとしています。 は、ここに私のコード考えられる原因java.io.IOException:CreateProcess error = 2、指定されたファイルが見つかりません

public void executeCommand() 
{ 
    String cmd1= "cmd.exe /c start"; 
    String location="C:\\PROGRA~1\\PostgreSQL\\8.3\\bin\\"; 
    String postgresCommand="psql -h localhost -U postgres -d postgres"; 
    String autoVaccum="-c \"vacuum verbose\""; 
    String []actualCmd={cmd1,location,postgresCommand,autoVaccum}; 

    Process process=null; 
    try { 
     process = Runtime.getRuntime().exec(actualCmd); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 


public static void main(String[] args) { 
    MyTest test= new MyTest(); 
    test.executeCommand(); 

} 

である。しかし、私は直接直接>実行ウィンドウにその実行sucessfully 例:[スタート] - 上記の文字列を入力すると、私は次の例外に

java.io.IOException: Cannot run program "cmd.exe /c start": CreateProcess error=2, The system cannot find the file specified 
    at java.lang.ProcessBuilder.start(Unknown Source) 
    at java.lang.Runtime.exec(Unknown Source) 
    at java.lang.Runtime.exec(Unknown Source) 
    at MyTest.executeCommand(MyTest.java:36) 
    at MyTest.main(MyTest.java:48) 
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified 
    at java.lang.ProcessImpl.create(Native Method) 
    at java.lang.ProcessImpl.<init>(Unknown Source) 
    at java.lang.ProcessImpl.start(Unknown Source) 
    ... 5 more 

を取得しています。 CMD.EXE/Cを開始しC:\ PROGRA〜1/PostgreSQLの/ 8.3/binに/ psqlの-h localhostの-U postgresのはpostgresの-c "冗長な真空を" -d

誰もが正確に上記のプログラムに間違っているかを知ることができます?

答えて

0

あなたは1つの引数としてcmd.exe /c startを渡しているので、正確にcmd.exe /c startというファイルを探して失敗します。

は代わりに、二つの文字列にcmd1を分割:cmd.exe/c start

1

は()のexecを呼び出すには、複数の方法があります。 String []を引数として取るあなたが使っているのは、各トークンが配列の別の部分にあると考えます。だからではなく、1つの文字列の配列と呼ばれる

Runtime.getRuntime().exec("cmd /c start executable arg1 arg2"); 

の呼び出し)は、(あなたが、その後のgetInputStreamとの出力をつかむことができ、

Process p = Runtime.getRuntime().exec(new String[]{"cmd","/c","start","executable","arg1","arg2");  
BufferedReader inReader = new BufferedReader(new InputStreamReader(p.getInputStream())); 
BufferedWriter outWriter = new BufferedWriter(new OutputStreamWriter(p.getOutputStream())); 

のexec()Processオブジェクトを返すと呼ばれています。これは実際にはプロセスからの出力であり、javaコードへの入力です。それを他のストリームと同じように読み込んで、適切に見えるようにユーザーに表示することができます。

+0

ありがとうThomas、 私のコードで少し修正を加えました。 String配列の代わりに単一の文字列を使用し、問題が解決されました。 文字列actualCmd = cmd1 + location + postgresCommand + autoVaccum; しかし、このプログラムは "VACUUM VERBOSE"コマンドでどのような操作が行われているかを示すコマンドラインウィンドウを開きません。 しかし、このプログラムを使って他のコマンドを実行すると、コマンドラインウィンドウが開きます 例:文字列cmd1 = "cmd.exe/c start dir"; 基本的には、ユーザーに 'vacuum command'の出力を表示したかった – Abhi

+0

Processオブジェクトからの出力を取得する際の更新を参照してください。 – Thomas

関連する問題