2011-01-14 8 views
35

명령 프롬프트를 열 수 있습니까 (그리고 다른 시스템에서 다른 터미널을 추측 할 수 있습니까). 새로 열린 창에서 명령을 실행할 수 있습니까?Java를 사용하여 명령 프롬프트를 열고 명령을 삽입하는 방법은 무엇입니까?

현재 내가 가지고있는 것은 이것이다 : 나는 "시작"후 다음 명령을 추가하려고했습니다

Runtime rt = Runtime.getRuntime(); 
rt.exec(new String[]{"cmd.exe","/c","start"}); 

, 내 명령을 포함하는 다른 rt.exec를 실행하려고했지만, 그럴 수 없어 그것을 작동시키는 방법을 찾아라.

java -flag -flag -cp terminal-based-program.jar 

편집 불행하게도 내가 가진 몇몇 이상한 결과 :

가 중요한 경우

, 나는 다음과 유사한 명령을 실행하기 위해 노력하고있어. 명령 프롬프트를 성공적으로 실행하고 다음을 사용하여 명령을 전달할 수있었습니다.

rt.exec("cmd.exe /c start command"); 

그러나 한 명령으로 만 작동하는 것 같습니다. "cmd.exe/c start command & command2"와 같은 명령 구분자를 사용하려고하면 두 번째 명령이 백그라운드를 통과합니다 (방금 rt.exec ("command2")를 사용한 경우와 같은 방식). ;). 이제 문제는 내가 jar 파일의 전체 경로를 사용하는 경우 jar 파일이 명령 프롬프트의 활성 디렉토리에서 데이터를 잘못 읽으므로 명령 프롬프트가 실행중인 디렉토리를 변경해야한다는 것을 알았습니다. 자원을 포함한 jar의 디렉토리 스노우 레오파드 (Snow Leopard)에 나를 위해

+1

java 명령에서 .exec를 실행하는 것과는 대조적으로 왜이 작업을 수행하려고하는지 명확히 할 수 있습니까? 명령 창이 자동으로 열립니다. –

+0

ktm5124의 답변에 대한 의견보기 –

답변

20

사람들은 rt.exec (String)을 사용하지 말 것을 권장하지만,이 방법이 효과적이며 배열 버전으로 변경하는 방법을 모르겠습니다.

rt.exec("cmd.exe /c cd \""+new_dir+"\" & start cmd.exe /k \"java -flag -flag -cp terminal-based-program.jar\""); 
+0

나는 당신이하는 것과 비슷한 일을하고 있으며,/c와/k가 어디에 있는지 궁금합니다. cmd에 대한 언급을 찾을 수없는 것 같습니다. 또한, 왜 당신은 따옴표를 벗어나고 있습니까? 그 사이의 값이 CMD에 전달되는 명령을 나타 내기 때문입니까? – Ungeheuer

+2

'cmd /? ' '/ C 문자열로 지정된 명령을 수행 한 다음 종료합니다. /K 문자열로 지정된 명령을 수행하지만' –

3

다음 작품 : 그 명령의 출력을 읽으려면

Runtime rt = Runtime.getRuntime(); 
String[] testArgs = {"touch", "TEST"}; 
rt.exec(testArgs); 

것이있다, 당신은 프로세스의 입력 스트림을 읽을 필요가있다. 예를 들어,

Process pr = rt.exec(arguments); 
BufferedReader r = new BufferedReader(new InputStreamReader(pr.getInputStream())); 

명령의 라인 별 출력을 매우 쉽게 읽을 수 있습니다.

MS-DOS가 "새 명령 프롬프트 시작"을 의미하는 인수 순서를 해석하지 않을 수도 있습니다. 귀하의 배열은 아마되어야합니다 :

{ "시작", "cmd.exe를", "\ C를"}

새로운 명령 프롬프트에서 명령을 열려면, 당신은 프로세스 참조를 사용해야 할 것입니다. 하지만 제 앞에있는 사람이 말했듯이, 왜 네가 임원을 사용할 수있을 때 그렇게하고 싶지는 모르겠다.

+0

새 명령 프롬프트에서 명령을 열고 싶은 이유는 시작하려는 프로그램이 콘솔의 입력과 출력을 콘솔 기반 프로그램으로 가져오고 콘솔로 각각 들어 오기 때문입니다. 참고로, 제가 시작하려고하는 프로그램은 제가 만든 프로그램이 아니므로 프로그램의 작동 원리에 따라 프로그램을 변경해야합니다. –

6

그냥 명령 프롬프트에서 실행되는 디렉토리를 변경 한 번에 두 개의 명령을 실행하는 경우, 현재 작업 디렉토리를 지정할 수 있습니다 Runtime.exec의 방법에 대한 과부하가있다. 마찬가지로

Runtime rt = Runtime.getRuntime(); 
rt.exec("cmd.exe /c start command", null, new File(newDir)); 

이렇게하면 newDir의 디렉터리에서 명령 프롬프트가 열립니다. 나는 당신의 솔루션이 잘 작동한다고 생각하지만, 이것은 명령 문자열이나 배열을 조금 더 깨끗하게 유지시켜 준다.

명령을 문자열로 사용하고 명령을 문자열 배열로 사용하는 데 과부하가 있습니다.

ProcessBuilder (directory 메서드 사용)을 사용하면 현재 작업 디렉토리를 쉽게 설정할 수 있습니다.

희망이 도움이됩니다.

+0

'을 유지합니다. runtime.exec ("cmd.exe/c start" , null, 새 파일 (newDir)); – ChanGan

+1

이것을 사용했습니다. String newDir = "C : \\ Test \\ Application \\"; runtime.exec ("cmd.exe/c 시작 디렉토리", null, 새 파일 (newDir)); 이 폴더 아래에 C : \ Test \ Application \ avt install - filename .. 명령을 실행하려면 어떻게해야합니까? 이걸 도와 줄 수있어 ?? – ChanGan

8
public static void main(String[] args) { 
    String[] arg = new String[]{"-u root", "-h localhost"}; 

    try { 
     String ss = null; 
     Runtime obj = null; 
     Process p = Runtime.getRuntime().exec("cmd.exe /c start dir "); 
     BufferedWriter writeer = new BufferedWriter(new OutputStreamWriter(p.getOutputStream())); 
     writeer.write("dir"); 
     writeer.flush(); 
     BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream())); 
     System.out.println("Here is the standard output of the command:\n"); 
     while ((ss = stdInput.readLine()) != null) { 
      System.out.println(ss); 
     } 
     System.out.println("Here is the standard error of the command (if any):\n"); 
     while ((ss = stdError.readLine()) != null) { 
      System.out.println(ss); 
     } 

    } catch (IOException e) { 
     System.out.println("FROM CATCH" + e.toString()); 
    } 

} 
+7

코드에서 관련성없는 주석을 제거하고 관련성이 높은 주석을 추가 할 수 있습니다. –

1

전달한 문자열 뒤에 명령을 추가하기 만하면됩니다.

문자열 명령 = "cmd.exe/c 시작"+ "명령";

처리 자식 = Runtime.getRuntime(). exec (명령);

0

다음과 같은 매개 변수에 명령을 입력하십시오.

Runtime.getRuntime(). exec ("cmd.exe/c start cmd/k \"매개 변수 \ "");

관련 문제