Pergunta

Na minha aplicação Java, eu quero executar um arquivo em lotes que chama "scons -Q implicit-deps-changed build\file_load_type export\file_load_type"

Parece que eu não posso mesmo começar meu arquivo de lote para executar. Eu estou fora de ideias.

Isto é o que eu tenho em Java:

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

Anteriormente, eu tinha um arquivo Python Sconscript que eu queria correr, mas desde que não funcionou eu decidi que iria chamar o script através de um arquivo de lote, mas esse método não tem sido bem sucedida até o momento.

Foi útil?

Solução

Os arquivos de lote não é um executável. Eles precisam de um aplicativo para executá-los (ou seja cmd).

No UNIX, o arquivo de script tem shebang (#!) No início de um arquivo para especificar o programa que executa. Duplo clique no Windows é executado pelo Windows Explorer. CreateProcess não sabe nada sobre isso.

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

Nota: Com o comando start \"\", uma janela de comando separada será aberta com um título em branco e qualquer saída do arquivo de lote será exibido lá. Ele também deve funcionar com apenas `cmd / c build.bat", caso em que a saída pode ser lido a partir da sub-processo em Java se desejar.

Outras dicas

Às vezes o tempo do processo de execução da linha é maior do segmento JVM tempo de espera processo, use a acontecer quando o processo que você está invocando leva algum tempo para ser processado, use o comando waitFor () da seguinte forma:

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     

}

Desta forma, a JVM vai parar até que o processo que você está invocando é feito antes de continuar com a pilha de execução fio.

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

Para executar arquivos em lote usando java, se é isso que você está falando ...

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

Isso deve fazê-lo.

ProcessBuilder é o Java 5 / 6 maneira de executar processos externos.

O executável usado para executar scripts em lote é cmd.exe que usa a bandeira /c para especificar o nome do arquivo de lote para executar:

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

Teoricamente você também deve ser capaz de executar Scons desta forma, embora eu não testei isso:

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

EDIT: Amara, você diz que isso não está funcionando. O erro que você listou é o erro que você deseja obter ao executar Java a partir de um terminal Cygwin em uma caixa de Windows; é isso que você está fazendo? O problema com isso é que o Windows e Cygwin têm caminhos diferentes, de modo a versão Windows do Java não vai encontrar as scons executável em seu caminho Cygwin. Eu posso explicar melhor se isto acaba por ser o seu problema.

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

testados com jdk1.5 e JDK1.6

Este foi funcionando bem para mim, espero que ajude os outros também. para conseguir isso eu tenho lutado mais dias. : (

Eu tive o mesmo problema. No entanto, por vezes, CMD não conseguiu executar meus arquivos. É por isso que criar uma temp.bat no meu desktop, ao lado deste temp.bat está indo para executar meu arquivo, e em seguida o arquivo temporário vai ser excluído.

Eu sei que isto é um código maior, no entanto trabalhou para mim em 100% quando até mesmo Runtime.getRuntime (). Exec () falhou.

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

A seguir está funcionando bem:

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

Este código será executado duas commands.bat que existe no caminho C:. / Pastas / pasta

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

Para expandir a @ anwser de Isha você poderia apenas fazer o seguinte para obter o resultado retornado (post-facto não em rea-ltime) do script que foi executado:

try {
    Process process = Runtime.getRuntime().exec("cmd /c start D:\\temp\\a.bat");
    System.out.println(process.getText());
} catch(IOException e) {
    e.printStackTrace();
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top