자바에서 cmd 명령어 실행하기 (또는 외부 어플)


참조 링크 : http://yangyag.tistory.com/55


자바에서 shutdown 명령어를 이용하여 PC를 종료하고자 할때..


	private void setShutDown(){
		String[] cmd = new String[] {"shutdown", "-s", "-t", "61200"};  // 17시간후,  1시간=3600
//		String[] cmd = new String[] {"shutdown", "-a"};  // 취소
		try {
			Process process = new ProcessBuilder(cmd).start();
			// SequenceInputStream은 여러개의 스트림을 하나의 스트림으로 연결해줌.
			SequenceInputStream seqIn = new SequenceInputStream(process.getInputStream(), process.getErrorStream());		
			Scanner s = new Scanner(seqIn);
			while (s.hasNextLine() == true) {
				LogUtil.println(s.nextLine());
			}			

		} catch (IOException e) {
			LogUtil.println("종료예약 실패 : " + e.getMessage());
			e.printStackTrace();
		}
	}

XP에서는 shutdown -s -t 3600  이렇게 하면 되고,

Win7에서는 XP에서 처럼 해도 되고, shutdown /s /t 3600 이렇게 해도 된다.


아래는 shutdown 도움말이다.

###################################################################

Microsoft Windows [Version 6.1.7601]

Copyright (c) 2009 Microsoft Corporation. All rights reserved.


C:\Users\damianjj>shutdown

사용법: shutdown [/i | /l | /s | /r | /g | /a | /p | /h | /e] [/f]

        [/m \\컴퓨터][/t xxx][/d [p|u:]xx:yy [/c "주석"]]


    인수 없음    도움말을 표시합니다. 이 옵션은 /?를 입력하는 것과 같습니다.

    /?           도움말을 표시합니다. 아무 옵션을 입력하지 않는 것과 같은 결과를

 제공합니다.

    /i           GUI를 표시합니다.

               이 옵션은 첫 번째 옵션이어야 합니다.

    /l           로그오프합니다. /m 또는 /d 옵션과 함께 사용할 수 없습니다.

    /s           컴퓨터를 종료합니다.

    /r           컴퓨터를 종료하고 다시 시작합니다.

    /g          컴퓨터를 종료하고 다시 시작합니다. 시스템이

               다시 부팅된 후에 등록된 모든 응용 프로그램을 다시 시작합니다.

    /a           시스템 종료를 중단합니다.

               이 옵션은 시간 제한 기간 동안에만 사용할 수 있습니다.

    /p           제한 시간 또는 경고 없이 로컬 컴퓨터를 끕니다.

               이 옵션은 /d 및 /f 옵션과 함께 사용할 수 있습니다.

    /h           로컬 컴퓨터를 최대 절전 모드로 전환합니다.

               이 옵션은 /f 옵션과 함께 사용할 수 있습니다.

    /e           컴퓨터의 예기치 못한 종료의 원인을 문서화합니다.

    /m \\컴퓨터 대상 컴퓨터를 지정합니다.

    /t xxx     시스템 종료 전 시간 제한 기간을 xxx초로 설정합니다.

               유효한 범위는 0-315360000(10년)이며, 기본값은 30입니다.

               제한 시간 기간이 0보다 큰 경우 /f 매개 변수가

               암시됩니다.

    /c "주석"    다시 시작 또는 종료의 원인을 설명하는 주석을 답니다.

               최대 512자를 사용할 수 있습니다.

    /f         사용자에게 미리 경고하지 않고 실행 중인 응용 프로그램을 강제로 닫

습니다.

               0보다 큰 값이 /t 매개 변수에 대해 지정된 경우

               /f 매개 변수가 암시됩니다.

    /d [p|u:]xx:yy 다시 시작 또는 종료의 원인을 제공합니다.

               p는 다시 시작 또는 종료가 예정되어 있다는 의미입니다.

               u는 사용자가 원인을 정의한다는 의미입니다.

               p와 u가 모두 지정되어 있지 않으면 다시 시작 또는 시스템 종료가

               예정되지 않습니다.

               xx는 주요 원인 번호(256 미만의 양수)입니다.

               yy는 보조 원인 번호(65536 미만의 양수)입니다.


종료 원인:

(E = 예상된 종료 U = 예상되지 않은 종료 P = 계획됨, C = 사용자 지정)

형식    주요    보조    제목


 U      0       0       기타(계획되지 않음)

E       0       0       기타(계획되지 않음)

E P     0       0       기타(계획됨)

 U      0       5       기타 오류: 시스템 응답 없음

E       1       1       하드웨어: 유지 관리(계획되지 않음)

E P     1       1       하드웨어: 유지 관리(계획됨)

E       1       2       하드웨어: 설치(계획되지 않음)

E P     1       2       하드웨어: 설치(계획됨)

E       2       2       운영 체제: 복구(계획됨)

E P     2       2       운영 체제: 복구(계획됨)

  P     2       3       운영 체제: 업그레이드(계획됨)

E       2       4       운영 체제: 재구성(계획되지 않음)

E P     2       4       운영 체제: 재구성(계획됨)

  P     2       16      운영 체제: 서비스 팩(계획됨)

        2       17      운영 체제: 핫픽스(계획되지 않음)

  P     2       17      운영 체제: 핫픽스(계획됨)

        2       18      운영 체제: 보안 픽스(계획되지 않음)

  P     2       18      운영 체제: 보안 픽스(계획됨)

E       4       1       응용 프로그램: 유지 관리(계획되지 않음)

E P     4       1       응용 프로그램: 유지 관리(계획됨)

E P     4       2       응용 프로그램: 설치(계획됨)

E       4       5       응용 프로그램: 응답 없음

E       4       6       응용 프로그램: 안정적이지 않음

 U      5       15      시스템 오류: 중지 오류

 U      5       19      보안 문제

E       5       19      보안 문제

E P     5       19      보안 문제

E       5       20      네트워크 연결 손실(계획되지 않음)

 U      6       11      전원 오류: 코드 빠짐

 U      6       12      전원 오류: 환경

  P     7       0       레거시 API 종료


C:\Users\damianjj>shutdown /s /f /t 3600


C:\Users\damianjj>shutdown /a


C:\Users\damianjj>



아래는 참조 링크에 있는 내용 그대로 이다.

################################################################### 

자바로 외부 프로그램 실행 시키는 방법중에 ProcessBuilder 에 대해서 간단하게 소개 하려고 한다.

자바에서는 외부 프로그램 실행 시 출력 내용을 바로 확인 할 수 없고 버퍼에 저장 후 출력하는 형식으로 

확인 하여야 한다.


JDK 1.4 버전 이하에서는 exec() 메소드를 이용하여 외부 프로그램을 실행 시킬 수 있고

JDK 1.5 버전 이상에서는 ProcessBuilder 객체를 이용하여 외부 프로그램을 실행 시킬 수 있다.


Process 객체 생성 후 실행 할 커맨드를 다음과 같이 쪼개어 인자값으로 넣어 주어야 한다.

Process process = new ProcessBuilder("cmd", "dir", "/w").start();


위와같이 표현 한다면 cmd 커맨드 창을 실행 후 dir /w 명령어를 실행 한다는 의미 이다.


혹은 다음과 같이 배열을 이용하여 표현 할 수도 있다.

String[] cmd = new String[] {"cmd", "dir", "/w"};

Process process = new ProcessBuilder(cmd).start();


이렇게 실행 한 결과를 버퍼에 저장 후 표준 출력을 화면에 표시 하여야 하는데 다음과 같이 표현 할 수 있다.

BufferedReader stdOut = new BufferedReader( new InputStreamReader(process.getInputStream()) );

// 표준출력 상태를 출력
while( (str = stdOut.readLine()) != null ) {
    System.out.println(str);
}


InputStreamReader 객체를 통하여 위 process 객체에서 출력된 스트림을 입력 받아 버퍼에 저장 후 

while 문을 통하여 버퍼에 저장 된 내용을 표시하여 주는 것이다.


하나의 예로 웹 브라우저를 띄운 후 원하는 페이지로 이동 하는것을 예를 든다면 다음과 같이 할 수 있다.

String addr = "http://www.naver.com";
Process process = null;
String[] cmd = new String[] {"rundll32", "url.dll", "FileProtocolHandler", addr};
String str = null;

try {

    // 프로세스 빌더를 통하여 외부 프로그램 실행
    process = new ProcessBuilder(cmd).start();

    // 외부 프로그램의 표준출력 상태 버퍼에 저장
    BufferedReader stdOut = new BufferedReader( new InputStreamReader(process.getInputStream()) );
    
    // 표준출력 상태를 출력
    while( (str = stdOut.readLine()) != null ) {
        System.out.println(str);
    }
    
} catch (IOException e) {
    e.printStackTrace();

}


이렇게 하면 rundll32를 통하여 웹 브라우저 실행 후 네이버로 이동된다.


'자바 일반' 카테고리의 다른 글

간단한 java thread 사용방법..  (0) 2014.11.13
MATLAB jar 파일 메모리 증가 이슈  (0) 2014.10.20
java 폴더 생성  (0) 2014.09.11
MATLAB 실행 오류  (0) 2014.09.04
enum 응용, Properties (속성) 사용 예제  (0) 2014.08.28

+ Recent posts