programing

Java 어플리케이션에서 배치파일을 실행하려면 어떻게 해야 하나요?

projobs 2022. 12. 20. 22:10
반응형

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() );
}

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

java를 사용하여 배치 파일을 실행하려면...

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

이거면 될 거야.

배치 스크립트 실행에 사용되는 실행 파일은 다음과 같습니다.cmd.exe를 사용합니다./cflag를 사용하여 실행할 배치 파일의 이름을 지정합니다.

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

이론적으로 Scons도 이 방법으로 실행할 수 있습니다.다만, 테스트한 적은 없습니다.

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

편집: Amara, 당신은 이것이 효과가 없다고 말합니다.당신이 나열한 오류는 윈도우 박스의 Cygwin 터미널에서 Java를 실행할 때 발생하는 오류입니다.이것이 당신이 하고 있는 일입니까?문제는 Windows와 Cygwin의 경로가 다르기 때문에 Windows 버전의 Java는 Cygwin 경로에서 실행 가능한 스콘을 찾을 수 없다는 것입니다.만약 이것이 당신의 문제라면 제가 더 설명해 드릴 수 있습니다.

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

jdk1.5 및 jdk1.6으로 테스트 완료

나한테는 잘 먹혔어. 다른 사람들도 도움이 됐으면 좋겠어. 이걸 얻으려고 며칠 더 애를 썼어.:(

저도 같은 문제가 있었어요.그러나 CMD가 파일을 실행할 수 없는 경우가 있습니다.그 때문에 데스크탑에 temp.bat을 작성하고 다음으로 이 temp.bat에서 파일을 실행하고 다음으로 temp 파일을 삭제합니다.

이것이 더 큰 코드인 것은 알지만 Runtime.getRuntime().exec()조차 실패했을 때 100% 기능했습니다.

// creating a string for the Userprofile (either C:\Admin or whatever)
String userprofile = System.getenv("USERPROFILE");

BufferedWriter writer = null;
        try {
            //create a temporary file
            File logFile = new File(userprofile+"\\Desktop\\temp.bat");   
            writer = new BufferedWriter(new FileWriter(logFile));

            // Here comes the lines for the batch file!
            // First line is @echo off
            // Next line is the directory of our file
            // Then we open our file in that directory and exit the cmd
            // To seperate each line, please use \r\n
            writer.write("cd %ProgramFiles(x86)%\\SOME_FOLDER \r\nstart xyz.bat \r\nexit");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // Close the writer regardless of what happens...
                writer.close();
            } catch (Exception e) {
            }

        }

        // running our temp.bat file
        Runtime rt = Runtime.getRuntime();
        try {

            Process pr = rt.exec("cmd /c start \"\" \""+userprofile+"\\Desktop\\temp.bat" );
            pr.getOutputStream().close();
        } catch (IOException ex) {
            Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);

        }
        // deleting our temp file
        File databl = new File(userprofile+"\\Desktop\\temp.bat");
        databl.delete();

다음은 정상적으로 동작하고 있습니다.

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

이 코드는 경로 C:/folders/folder에 있는 두 개의 commands.bat을 실행합니다.

Runtime.getRuntime().exec("cd C:/folders/folder & call commands.bat");
import java.io.IOException;

public class TestBatch {

    public static void main(String[] args) {
        {
            try {
                String[] command = {"cmd.exe", "/C", "Start", "C:\\temp\\runtest.bat"};
                Process p =  Runtime.getRuntime().exec(command);           
            } catch (IOException ex) {
            }
        }

    }

}

@Isha의 anwser를 확장하려면 다음 작업을 수행하여 실행된 스크립트의 반환된 출력(실시간 내에 post-facto가 아님)을 가져옵니다.

try {
    Process process = Runtime.getRuntime().exec("cmd /c start D:\\temp\\a.bat");
    System.out.println(process.getText());
} catch(IOException e) {
    e.printStackTrace();
}

언급URL : https://stackoverflow.com/questions/615948/how-do-i-run-a-batch-file-from-my-java-application

반응형