2009-09-14 3 views
8

자바 프로그램에서 배치 파일을 실행하고 싶습니다.Java에서 배치 파일을 실행하는 방법은 무엇입니까?

다음 명령을 사용하고 있습니다.

Runtime.getRuntime().exec("server.bat"); 

그러나 문제는 절대 경로가 아닌 절대 경로를 제공하여 해당 java 프로젝트를 모든 comp에 배포 할 수있게하려는 것입니다. 다음과 같은

프로젝트의 디렉토리 구조는 다음과 같습니다

com 
    | 
    project 
    | 
    ------ parser 
    |   |_____ Main.java 
    | 
    -------util 
      |_____ Server.bat 

난에서 "Main.java"파일에서 "폴더의 유틸리티"디렉토리에서 "Server.bat"파일을 실행하려는 " 파서 "dir. 당신은이에 대한 ProcessBuilder을 사용할 수 있습니다

Runtime.getRuntime().exec(new String[] { "cmd.exe", "/c", "server.bat" }); 

답변

5

Java가 실행 중이고 Runtime.exec()가 상대 경로와 함께 사용되면 상대 경로는 JVM이 호출 된 현재 사용자 디렉토리에 상대적입니다. 당신은 COM의 상위 디렉토리에서 자바를 시작하는 경우

Runtime.getRuntime().exec("cmd.exe", "/c", "./com/projct/util/server.bat"); 

를 작동 할 수 있습니다.

또는 당신은 앱솔루트 경로 계산해야합니다 잊지

Runtime.getRuntime().exec("cmd.exe", "/c", 
System.getProperty("user.dir")+"/com/projct/util/server.bat"); 

When Runtime.exec() won't를 참조하십시오.

+0

3 개의 문자열 매개 변수를 사용하는 런타임 클래스에는 "exec"메소드가 없습니다. –

+0

사실입니다. 나는 String [] 버전을 의미하지만 SO 텍스트 상자에 사각형 parenthsis를 입력 할 수 없다 ... 나는 SO 매뉴얼/위키를 읽어야한다고 생각한다. – PeterMmm

+0

실행해야하는 세 개의 명령이 있다고 말할 수있다. CMD에서 3 개의 별도의 CMD 창이 각각의 명령에 대해 열리 며 하나의 CMD 창에서 3 개의 명령을 모두 실행할 수있는 방법이 있습니까? – viveksinghggits

6

당신은 인수 "cmd.exe를" "/ C"와 "server.bat"를 실행해야합니다. exec보다 훨씬 더 많은 제어 기능을 제공합니다. 특히, 방법 directory으로 작업 디렉토리를 설정할 수 있습니다.

예 :

물론
ProcessBuilder pb = new ProcessBuilder("server.bat"); 
pb.directory(new File(deployDir + "\\com\\project\\util")); 
Process p = pb.start(); 
int exitStatus = p.waitFor(); 

앱 어딘가에서 deployDir를 받아야합니다. 그것은 환경에서, 응용 프로그램 구성 파일에서 설정할 수 있습니다, 그것은 현재 사용자 디렉토리 또는 다른 수 있습니다.

8

:

+0

왜 작동하지 않는지 –

0

Plexus utils은 임의의 명령 줄을 호출하고 출력 구문 분석을 처리 할 수있는 명령 줄 유형을 제공합니다. 당신이 최고야

Commandline cl = new Commandline(); 

cl.setExecutable("cmd.exe"); 
cl.createArg().setValue("/c"); 

cl.setWorkingDirectory(new File(System.getProperty("user.dir"), 
    "/com/project/util/Server.bat")); 

cl.createArg().setValue("/c"); 

StreamConsumer consumer = new StreamConsumer() { 
    public void consumeLine(String line) { 
     //do something with the line 
    } 
}; 

StreamConsumer stderr = new StreamConsumer() { 
    public void consumeLine(String line) { 
     //do something with the line 
    } 
}; 

int exitCode; 

try { 
    exitCode = CommandLineUtils.execute(cl, consumer, stderr, getLogger()); 
} catch (CommandLineException ex) { 
    //handle exception 
} 
0

내기 시스템에서 응용 프로그램의 설치 디렉토리를 저장 한 다음 응용 프로그램 내에서 경로를 구축하는 것을 사용하는 것입니다. System.getProperty ("user.dir")는 현재 작업 디렉토리를 얻기 위해 Windows 및 Unix 플랫폼에서 작동해야하지만 시스템에 따라 다르므로이를 알고 있어야합니다.

0

exec의 두 번째 매개 변수는 환경 설정에 대한 args의 String []이며, exec에 대한 세 번째 매개 변수는 작업 디렉토리를 제공하는 파일이어야합니다. 이것을 시도하십시오 :

Runtime.getRuntime().exec("cmd /c server.bat", null, new File("./com/project/util")); 
4

지원되는 경우 데스크탑으로 시도 할 수 있습니다 (Java 1.6)

File file = new File("server.bat"); 
    Desktop.getDesktop().open(file); 
+0

정말 새로운 기능입니다. – Arshed

관련 문제