[java] Java 애플리케이션에서 배치 파일을 어떻게 실행합니까?

Java 애플리케이션에서 ” scons -Q implicit-deps-changed build\file_load_type export\file_load_type” 를 호출하는 배치 파일을 실행하려고합니다.

배치 파일을 실행할 수없는 것 같습니다. 나는 아이디어가 없습니다.

이것이 내가 Java에있는 것입니다.

Runtime.
   getRuntime().
   exec("build.bat", null, new File("."));

이전에는 실행하고 싶은 Python Sconscript 파일이 있었지만 작동하지 않았기 때문에 배치 파일을 통해 스크립트를 호출하기로 결정했지만 그 방법은 아직 성공하지 못했습니다.



답변

배치 파일은 실행 파일이 아닙니다. 이를 실행하려면 응용 프로그램 (예 : cmd)이 필요합니다.

UNIX에서 스크립트 파일은 파일을 실행하는 프로그램을 지정하기 위해 파일 시작 부분에 shebang (#!)이 있습니다. Windows에서 더블 클릭은 Windows 탐색기에서 수행됩니다. CreateProcess그것에 대해 아무것도 모릅니다.

Runtime.
   getRuntime().
   exec("cmd /c start \"\" build.bat");

참고 : start \"\"명령을 사용하면 빈 제목으로 별도의 명령 창이 열리고 배치 파일의 모든 출력이 여기에 표시됩니다. 또한`cmd / c build.bat “와 함께 작동해야합니다.이 경우 원하는 경우 Java의 하위 프로세스에서 출력을 읽을 수 있습니다.


답변

때로는 스레드 실행 프로세스 시간이 JVM 스레드 대기 프로세스 시간보다 높을 때 호출하는 프로세스가 처리되는 데 시간이 걸릴 때 발생합니다. 다음과 같이 waitFor () 명령을 사용하십시오.

try{
    Process p = Runtime.getRuntime().exec("file location here, don't forget using / instead of \\ to make it interoperable");
    p.waitFor();

}catch( IOException ex ){
    //Validate the case the file can't be accesed (not enought permissions)

}catch( InterruptedException ex ){
    //Validate the case the process is being stopped by some external situation     

}

이런 식으로 JVM은 스레드 실행 스택을 계속하기 전에 호출하는 프로세스가 완료 될 때까지 중지됩니다.


답변

Runtime runtime = Runtime.getRuntime();
try {
    Process p1 = runtime.exec("cmd /c start D:\\temp\\a.bat");
    InputStream is = p1.getInputStream();
    int i = 0;
    while( (i = is.read() ) != -1) {
        System.out.print((char)i);
    }
} catch(IOException ioException) {
    System.out.println(ioException.getMessage() );
}


답변

Java를 사용하여 배치 파일을 실행하려면 …

String path="cmd /c start d:\\sample\\sample.bat";
Runtime rn=Runtime.getRuntime();
Process pr=rn.exec(path);`

그렇게해야합니다.


답변

ProcessBuilder 는 외부 프로세스를 실행하는 Java 5/6 방법입니다.


답변

배치 스크립트를 실행하는 데 사용되는 실행 파일 cmd.exe/c플래그를 사용하여 실행할 배치 파일의 이름을 지정하는 것입니다.

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

이론적으로는이 방식으로 Scon을 실행할 수 있어야합니다.

Runtime.getRuntime().exec(new String[]{"scons", "-Q", "implicit-deps-changed", "build\file_load_type", "export\file_load_type"});

편집 : Amara, 이것이 작동하지 않는다고 말합니다. 나열한 오류는 Windows 상자의 Cygwin 터미널에서 Java를 실행할 때 발생하는 오류입니다. 이것이 당신이하는 일입니까? 문제는 Windows와 Cygwin의 경로가 다르기 때문에 Windows 버전의 Java가 Cygwin 경로에서 실행 가능한 scons를 찾지 못한다는 것입니다. 이것이 당신의 문제로 밝혀지면 더 설명 할 수 있습니다.


답변

Process p = Runtime.getRuntime().exec(
  new String[]{"cmd", "/C", "orgreg.bat"},
  null,
  new File("D://TEST//home//libs//"));

jdk1.5 및 jdk1.6으로 테스트 됨

이것은 나를 위해 잘 작동하고 다른 사람들에게도 도움이되기를 바랍니다. 이것을 얻기 위해 나는 더 많은 일을 고생했습니다. 🙁