2012-03-19 8 views
0

를 지정했습니다. 다음은 내 코드원인 때 java.io.IOException : CreateProcess를 오류 = 2, 파일을 찾을 수 없습니다 내가 자바를 통해 'VACUUM VERBOSE'명령을 실행하려고

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(); 

} 

입니다하지만 직접 직접> 실행 창 자사가 실행 성공적으로 예 : 시작 -에 위의 문자열을 입력 할 때 나는 다음과 같은 예외를

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 start C : \ PROGRA ~ 1/PostgreSQL/8.3/bin/psql -h localhost -U postgres -d postgres -c "vacuum verbose"

위의 프로그램에서 정확히 무엇이 잘못되었는지 알 수 있습니까? ?

답변

0

cmd.exe /c start을 하나의 인수로 전달하므로 정확히 cmd.exe /c start이라는 파일을 찾고 실패합니다.

대신, 두 개의 문자열로 cmd1 분할 :) (간부를 호출하는 여러 가지 방법이 있습니다 cmd.exe/c start

1

. String []을 인자로받는 여러분이 사용하고있는 것은 각 토큰이 배열의 다른 부분에있을 것으로 기대합니다. 그래서 그 대신 하나의 문자열의 배열로 호출

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())); 

간부() 프로세스 개체가 반환라고한다 . 이것은 실제로 프로세스의 출력이며, java 코드로 입력됩니다. 그런 다음 다른 스트림과 동일하게 읽고 사용자에게 적합하다고 표시 할 수 있습니다.

+0

감사 토마스, 나는 내 코드에 약간의 수정을했다. String 배열 대신 단일 문자열을 사용했으나 문제가 해결되었습니다. 문자열 actualCmd = cmd1 + location + postgresCommand + autoVaccum; 그러나이 프로그램은 "VACUUM VERBOSE"명령으로 수행되는 작업을 보여주는 명령 줄 창을 열지 못합니다. 그러나이 프로그램을 사용하여 다른 명령을 실행하면 명령 줄 창이 열립니다. 예 : 문자열 cmd1 = "cmd.exe/c 시작 디렉토리"; 는 기본적으로 나는 프로세스 개체의 출력을 얻기에 사용자 – Abhi

+0

참조 업데이트에 '진공 명령'의 출력을 보여주고 싶었어요. – Thomas

관련 문제