2016-06-20 4 views
0

cmd.exe를 통해 명령을 내리고 출력을 인쇄하는 Java 프로그램을 만들려고합니다. 이렇게하려면이 코드를 사용하고 있습니다.Java 명령 프롬프트 에뮬레이터

cmdLine = Runtime.getRuntime().exec("cmd.exe"); 
cmdLineOut = new BufferedReader(new InputStreamReader(cmdLine.getInputStream())); 
cmdLineIn = new PrintWriter(cmdLine.getOutputStream()); 
// ... 
cmdLineIn.println(command); 
cmdLineIn.flush(); 
String s = null; 
while ((s = cmdLineOut.readLine()) != null) 
    System.out.println(s); 

비록 입력이 주어지면 출력은 절대로 출력되지 않습니다.

편집 : 해결 cmdLineOut.readLine()은 입력이 비어있을 때 null을 반환하지 않고 고정시킵니다. readLine이 끝나면 다른 코드는 실행되지 않으므로 readLine의 인쇄를 별도의 스레드에 넣기 만하면됩니다.

누군가가 더 잘 대답하고 싶다면 계속 진행하십시오.

+0

오류 출력 – MeBigFatGuy

+0

'dir'과 같이 실행 파일이없는 명령을 실행하려면'cmd.exe/c dir'을 호출해야합니다. – Robert

+0

예, 처음에 그랬던 것입니다. 'cmd.exe/c cd path'를 호출하면'cmd.exe/c dir' 디렉토리가 정확하지 않으므로 환경을 유지할 방법이 필요합니다. –

답변

0

적어도 게시 한 스 니펫에서는 사용자 명령을 실행하지 않습니다. 또한 거의 모든 명령 프롬프트 "명령"은 실제로 기본 프로그램 검색 경로에있는 프로그램입니다. 각 명령마다 Runtime.getRuntime().exec(user_command) 일 것입니다. 즉, 각 명령에 대해 이미 수행 한 것처럼 입력 및 출력 스트림을 설정해야합니다. 별도의 스레드에서 입력을 얻는 것이 옳습니다. 입력을 읽으려는 시도가 실제로 읽을 때까지 현재 스레드를 차단할 것이기 때문입니다. 그러나 일부 명령은 심지어 UNIX 또는 Linux 시스템에서도 "내장"(예 : cd)인데 명령 프롬프트 (일명 "셸")가 명령을 내부적으로 처리한다는 것을 의미합니다. 프로그램은 사용자 입력을 테스트하여 내장 함수를 호출하는지 확인하고 내장 명령에 대한 호출을 특별히 처리해야합니다. 프로그램은 실제로 Windows가 아닌 컴퓨터로 이식 할 수 있어야합니다. 물론 사용자는 copy 대신 다른 명령 (cp)을 사용하지만, 추가해야 할 부분은 다른 OS의 '쉘'내장 목록을 처리하는 것입니다 (또는 단순히 프로그램에 "크로스 - 플랫폼 "내장 세트 - 이것은 쉘 프로그램이며, 규칙을 작성합니다.

+0

이 목적은 실제로 입력을 받아서 cmd로 보내고 출력을 다시 클라이언트로 보내는 것입니다. 명령을받는 cmd는 다른 컴퓨터에 있으므로 새로운 쉘을 원하지 않고 원격 쉘만 원한다. –

+0

그런 다음 게시 한 내용이 의미가 있습니다. 가끔 System.out.flush()를 호출합니까? flush()는 버퍼의 모든 출력이 실제로 표준 출력에 기록되도록합니다. –

+0

아, 고맙습니다. 콘솔에 문제가있어서 모든 출력이 항상 표시되는 것은 아닙니다. 나는 묻는가 아닌가를 논쟁하고 있었지만, 신경 쓰지 않았다 : D –