web-dev-qa-db-fra.com

Comment exécuter un fichier de commandes à partir de mon application Java?

Dans mon application Java, je veux exécuter un fichier de commandes qui appelle "scons -Q implicit-deps-changed build\file_load_type export\file_load_type"

Il semble que je ne puisse même pas exécuter mon fichier batch. Je suis à court d'idées. 

Voici ce que j'ai en Java:

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

Auparavant, je voulais exécuter un fichier Python Sconscript, mais comme cela ne fonctionnait pas, j'ai décidé d'appeler le script via un fichier batch, mais cette méthode n'a pas encore abouti. 

100
Amara

Les fichiers batch ne sont pas un exécutable. Ils ont besoin d’une application pour les exécuter (c’est-à-dire cmd).

Sous UNIX, le fichier de script comporte Shebang (#!) Au début d'un fichier pour spécifier le programme qui l'exécute. Le double-clic dans Windows est effectué par l'explorateur Windows. CreateProcess ne sait rien à ce sujet.

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

Remarque: avec la commande start \"\", une fenêtre de commande distincte sera ouverte avec un titre vide et toutes les sorties du fichier de commandes y seront affichées. Cela devrait également fonctionner avec juste `cmd/c build.bat", auquel cas la sortie peut être lue à partir du sous-processus en Java si vous le souhaitez.

162
Paulo Guedes

Parfois, le temps d'exécution du processus d'exécution du thread est supérieur au temps d'attente du processus en attente du thread JVM. Cela se produisait lorsque le processus que vous appelez mettait du temps à être traité. Utilisez la commande waitFor () comme suit:

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     

}

Ainsi, la machine virtuelle Java s'arrête jusqu'à ce que le processus que vous appelez soit terminé avant de continuer avec la pile d'exécution du thread.

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

Pour exécuter des fichiers de commandes en utilisant Java si c'est ce dont vous parlez ...

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

Cela devrait le faire.

13
Abbia

ProcessBuilder est le moyen Java 5/6 d'exécuter des processus externes.

12
basszero

Le fichier exécutable utilisé pour exécuter les scripts de commandes est cmd.exe, qui utilise l'indicateur /c pour spécifier le nom du fichier de commandes à exécuter:

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

Théoriquement, vous devriez aussi pouvoir exécuter Scons de cette manière, bien que je n’aie pas testé cela:

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

EDIT: Amara, vous dites que cela ne fonctionne pas. L'erreur que vous avez répertoriée correspond à l'erreur que vous auriez lors de l'exécution de Java à partir d'un terminal Cygwin sous Windows; est-ce ce que vous faites? Le problème avec cela est que Windows et Cygwin ont des chemins différents, donc la version Windows de Java ne trouvera pas l'exécutable scons sur votre chemin Cygwin. Je peux expliquer davantage si cela s'avère être votre problème.

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

testé avec jdk1.5 et jdk1.6

Cela fonctionnait très bien pour moi, j'espère que cela aidera les autres aussi ..__ pour l'obtenir, j'ai lutté plus de jours. :(

3
Suren

J'ai eu le même problème. Cependant, parfois, CMD n’exécutait pas mes fichiers . C’est pourquoi j’ai créé un fichier temp.bat sur mon bureau, puis ce fichier temp.bat va exécuter mon fichier, puis le fichier temporaire va être supprimé.

Je sais que c'est un code plus gros, mais il a fonctionné pour moi à 100% lorsque même Runtime.getRuntime (). Exec () a échoué.

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

Ce qui suit fonctionne bien:

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

Ce code exécutera deux commandes.bat existant dans le chemin C:/folder/folder.

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

Pour développer la réponse de @ Isha , vous pouvez simplement procéder comme suit pour obtenir la sortie renvoyée (après coup) du script exécuté:

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