IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Exécuter commande système sous Windows en Java


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut Exécuter commande système sous Windows en Java
    Bonsoir, je cherche à faire une classe pouvant lancer des programmes divers (.py .exe etc etc).

    J'ai d'abord voulu tester une simple commande batch.

    A savoir la commande help du cmd.

    A l'exécution voilà ce que j'obtiens:

    Exécution de la commande:

    Microsoft Windows [version 6.1.7601]
    Copyright (c) 2009 Microsoft Corporation. Tous droits r‚serv‚s.
    Je retourne donc une erreur.

    Mais d'où vient elle je n'arrive pas à savoir...


    Voici le code complet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
     
    //Allow to launch any system command
    public class Launch {
     
     
    private static BufferedReader getOutput(Process p) {
        return new BufferedReader(new InputStreamReader(p.getInputStream()));
    }
     
    private static BufferedReader getError(Process p) {
        return new BufferedReader(new InputStreamReader(p.getErrorStream()));
    }
    	private String command;
     
    	public String getCommand(){
    		return this.command;
    	}
     
    	public Launch(String com){
    		this.command=com;
    	}
     
    	//launch command using exec
    	public void exe(){
    		try {
    			String[] commande = {"cmd.exe",this.getCommand()};
    			System.out.println("Exécution de la commande:\n");
                Process p = Runtime.getRuntime().exec(commande);
                BufferedReader output = getOutput(p);
                BufferedReader error = getError(p);
                String ligne = "";
                while ((ligne = output.readLine()) != null) {
                    System.out.println(ligne);
                }
                System.out.println("En attente1:\n");
                while ((ligne = error.readLine()) != null) {
                    System.out.println(ligne);
                }
                System.out.println("En attente2:\n");
                p.waitFor();
    			System.out.println("Commande exécuté\n");
    		} catch (IOException e) {
    			System.out.println("La commande a échoué\n");
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (InterruptedException e) {
    			System.out.println("Echec wait for\n");
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
     
    	public static void main(String[] args) {
    		String com="help";
    		Launch test=new Launch(com);
    		test.exe();
    	}
    }
    En attente1 ne s'affiche pas, l'erreur est donc sur output.


    Merci à vous !

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Premièrement, tu dois exécuter cmd.exe avec le paramètre /c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String[] commande = {"cmd.exe","/c",this.getCommand()};
    Ensuite, attention avec la lecture des flux : la lecture de l'un peut bloquer tout le process si rien n'est écrit dedans. Par exemple, si tu inverses la lecture de error et output dans ton cas, l'exécution sera bloquée en attente de quelque chose sur error qui n'arrivera jamais. Il faudrait threader les lectures des flux. Pour simplifier ça, il y a la classe ProcessBuilder.
    :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    String[] commande = {"cmd.exe","/c",this.getCommand()};
    System.out.println("Exécution de la commande:\n");
     
    ProcessBuilder pb = new ProcessBuilder(commande);
    pb.redirectError(Redirect.INHERIT);
    pb.redirectOutput(Redirect.INHERIT);
    Process p = pb.start();
    System.out.println("En attente2:\n");
    p.waitFor();
    System.out.println("Commande exécuté\n");
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    Salut, et merci pour ta réponse.

    Je n'ai pas testé, je ne pourrais regarder que demain, mais j'ai tout de même une question.

    Pourquoi faut-il rajouter "\c" ? Faudrait-il le rajouter si la commande système précédente n'était pas cmd.exe, mais un autre programme ?

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    C'est un paramètre de l'exécutable cmd.exe :

    [...]>cmd /?
    Démarre une nouvelle instance de l’interpréteur de commandes de Windows

    CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]
    [[/S] [/C | /K] chaîne]

    /C Exécute la commande donnée par la chaîne de caractères puis se termine.
    /K Exécute la commande donnée par la chaîne de caractères et reste actif.
    /S Modifie le traitement de la chaîne après /C ou /K (voir ci-dessous).
    /Q Exécute (sans interactions) la commande donnée puis reste actif.
    /D Désactive l’exécution d’AutoRun à partir du Registre (voir ci-dessous).
    /A Redirige la sortie de commandes internes vers un canal ou un fichier
    ANSI.
    /U Redirige la sortie de commandes internes vers un canal ou un fichier
    UNICODE.
    /T:fg Change la couleur du premier plan ou de l’arrière-plan (voir aussi
    COLOR /?).
    /E:ON Active les extensions de commande (voir ci-dessous).
    /E:OFF Désactive les extensions de commande (voir ci-dessous).
    /F:ON Active les caractères de fin des noms de fichiers et de répertoires
    (voir ci-dessous).
    /F:OFF Désactive les caractères de fin des noms de fichiers et de répertoires
    (voir ci-dessous).
    /V:ON Active l’expansion retardée des variables d’environnement en utilisant
    Appuyez sur une touche pour continuer...
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par Amnael Voir le message
    Bonsoir, je cherche à faire une classe pouvant lancer des programmes divers (.py .exe etc etc).

    J'ai d'abord voulu tester une simple commande batch.

    A savoir la commande help du cmd.
    Joel a déjà corrigé ton code au dessus.
    Mauvais choix. Help est une commande interne du shell windows, pas un programme. Ce qui fait que tu dois la lancer en utilisant "cmd.exe", avec des paramètres particuliers pour qu'il n'affichage pas de fenêtre, ce que tu ne fera pas lorsque tu lancera d'autre programmes (cmd.exe en gros ça sert à quedalle dans 99% des cas). Si tu veux te faire la main, c'est plus représentatif de lancer de vrais programmes

    Citation Envoyé par Amnael Voir le message
    Faudrait-il le rajouter si la commande système précédente n'était pas cmd.exe, mais un autre programme ?
    non

  6. #6
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    D'accord merci à vous deux.


    Je me dois tout de même de préciser une chose, j'aimerais bien en testant ces commandes voir le shell de windows s'ouvrir et s'exécuter, car par la suite dans les programmes que j'utiliserais il y aura probablement des shell qui devront rester ouvert du style serveur par exemple.


    EN fait, je pensais presque utiliser cmd.exe pour lancer les programmes via du shell, mais d'après ce que vous me dîtes ce n'est pas la bonne méthode ? Si j'ai un fichier test.py; la fonction exec pourra lancer directement test.py sans ouvrir le cmd au préalable ?

  7. #7
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    Bonjour,

    j'ai testé et ça marche parfaitement.

    Et si je met le path d'un fichier dans command, il s'ouvre bien, cela devrait donc marcher pour lancer un programme quelconque. Certes je passe par le batch mais finalement c'est pas un soucis vu que le projet est destiné à windows.

    Merci à vous !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Exécution commande Telnet sous Java
    Par akbwalid dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 27/07/2011, 13h36
  2. [Système] Commande system() sous Windows
    Par gouakkamol dans le forum Langage
    Réponses: 1
    Dernier message: 10/01/2008, 18h43
  3. Exécution de JCL sous Windows ou Unix
    Par al1_24 dans le forum JCL - SORT
    Réponses: 3
    Dernier message: 23/07/2007, 20h33
  4. Freeze système sous windows !
    Par n!co dans le forum NetBeans
    Réponses: 3
    Dernier message: 02/11/2006, 13h10
  5. Réponses: 5
    Dernier message: 19/04/2005, 08h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo