web-dev-qa-db-fra.com

Comment puis-je exécuter plusieurs commandes dans une seule fenêtre cmd en Java?

ce que je voudrais faire est d'exécuter plusieurs fois un fichier batch à partir d'une application Java. Par conséquent, j'ai configuré un for-loop qui exécute ce code n fois:

for (int i = 0; i < n; i++) {
    Runtime.getRuntime().exec("cmd /c start somefile.bat");
}

Le problème est qu'à chaque fois que la commande est exécutée, une nouvelle fenêtre cmd apparaît. Cependant, ce que je veux, c'est juste ne fenêtre qui apparaît au début et qui est utilisée pour afficher toutes les données des appels de commande suivants.

Comment puis je faire ça?

13
user2426316

Avec && vous pouvez exécuter plusieurs commandes l'une après l'autre:

Runtime.getRuntime().exec("cmd /c \"start somefile.bat && start other.bat && cd C:\\test && test.exe\"");

Utilisation de plusieurs commandes et symboles de traitement conditionnel

Vous pouvez exécuter plusieurs commandes à partir d'une seule ligne de commande ou d'un seul script à l'aide de symboles de traitement conditionnel. Lorsque vous exécutez plusieurs commandes avec des symboles de traitement conditionnel, les commandes à droite du symbole de traitement conditionnel agissent en fonction des résultats de la commande à gauche du symbole de traitement conditionnel.

Par exemple, vous souhaiterez peut-être exécuter une commande uniquement si la commande précédente échoue. Ou, vous souhaiterez peut-être exécuter une commande uniquement si la commande précédente a réussi. Vous pouvez utiliser les caractères spéciaux répertoriés dans le tableau suivant pour passer plusieurs commandes.

& [...] command1 & command2
Permet de séparer plusieurs commandes sur une seule ligne de commande. Cmd.exe exécute la première commande, puis la deuxième commande.

&& [...] command1 && command2
Utilisez pour exécuter la commande suivant && uniquement si la commande précédant le symbole a réussi. Cmd.exe exécute la première commande, puis exécute la deuxième commande uniquement si la première commande s'est terminée avec succès.

|| [...] command1 || command2
Utilisez pour exécuter la commande suivante || uniquement si la commande précédant || échoue. Cmd.exe exécute la première commande, puis exécute la deuxième commande uniquement si la première commande ne s'est pas terminée correctement (reçoit un code d'erreur supérieur à zéro).

( ) [...] (command1 & command2)
Utilisez pour regrouper ou imbriquer plusieurs commandes.

; or , command1 parameter1;parameter2
Utilisez pour séparer les paramètres de commande.

26
stan

J'utiliserais ProcessBuilder de Java ou une autre classe qui simule/utilise un Shell. L'extrait suivant illustre l'idée (pour Linux avec bash).

import Java.util.Scanner;
import Java.io.*;

public class MyExec {
    public static void main(String[] args)
    {
        //init Shell
        ProcessBuilder builder = new ProcessBuilder( "/bin/bash" );
        Process p=null;
        try {
            p = builder.start();
        }
        catch (IOException e) {
            System.out.println(e);
        }
        //get stdin of Shell
        BufferedWriter p_stdin = 
          new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));

        // execute the desired command (here: ls) n times
        int n=10;
        for (int i=0; i<n; i++) {
            try {
                //single execution
            p_stdin.write("ls");
            p_stdin.newLine();
            p_stdin.flush();
            }
            catch (IOException e) {
            System.out.println(e);
            }
        }

        // finally close the Shell by execution exit command
        try {
            p_stdin.write("exit");
            p_stdin.newLine();
            p_stdin.flush();
        }
        catch (IOException e) {
            System.out.println(e);
        }

    // write stdout of Shell (=output of all commands)
    Scanner s = new Scanner( p.getInputStream() );
    while (s.hasNext())
    {
        System.out.println( s.next() );
    }
       s.close();
    }
}

Veuillez noter que ce n'est qu'un extrait de code, qui doit être adapté pour Windows, mais en général, il devrait fonctionner avec cmd.exe.

15
Jost