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

Java Discussion :

lancement de commande DOS en java


Sujet :

Java

  1. #1
    Membre habitué Avatar de horkets
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    326
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 326
    Points : 138
    Points
    138
    Par défaut lancement de commande DOS en java
    Bonjour à tous,

    Je voudrais faire tourner un prog java en tant que service dans Windows.
    Ce programme est censé envoyer des commandes DOS de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd /c query.exe termserver
    Et récupérer les résultats pour les traiter.

    Seulement, je n'ai aucune idée de la valeur de retour de ces commandes.
    Est ce que quelqu'un aurait une idée ?

    Merci d'avance ,

    .etS
    24 hours a day ... never enough

  2. #2
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut
    Si je comprend bien ton programme java exécute des commandes DOS. Si tu utilises exec(), tu peux récupérer l'output de la command en utilisant le getInputStream(). Ce qui donnerait:

    Process p = Runtime.getRuntime().exec(cmd);
    InputStream cmdOutput = p.getInputStream();

    Ensuite tu peux lier cmdOutput a un BufferedReader et lire l'output de ta commande.

    En espérant que cela t'a aidé.

  3. #3
    Membre régulier Avatar de Vesperal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 81
    Points : 81
    Points
    81
    Par défaut
    Pour executer une commande DOS, il suffit de faire un

    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
     
     
    		String ta_commande_dos;
     
    		Runtime runtime=Runtime.getRuntime();
    		Process processus=runtime.exec(ta_commande_dos);
     
    		InputStream i_stream=processus.getInputStream();
    		InputStreamReader reader=new InputStreamReader(i_stream);
     
    		String res="";
     
    		BufferedReader bf_reader= new BufferedReader(reader);
    		while (bf_reader.ready()) {
    			res+=bf_reader.readLine()+"\n";
    		}
     
    // plus qu'a récupérer le contenu de res, une chaine de caractères avec comme contenu le résultat de ta commande

  4. #4
    Membre habitué Avatar de horkets
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    326
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 326
    Points : 138
    Points
    138
    Par défaut
    Merci pour ces réponses rapides !

    Voilà le code complet avec lequel je n'obtiens que la première ligne affichée par le ping :
    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
     
    import java.io.*;
     public class DosQuery {    
        public static void main(String[] args) {
     
        	String cmd;
            cmd = "cmd /c ping localhost";
     
            try {
                 Runtime r = Runtime.getRuntime();
                 Process p = r.exec(cmd);
     
                 InputStream out = new BufferedInputStream( p.getInputStream());
     
                 byte[] b = new byte[1024]; 
                 int n = out.read(b); 
                 for(int i=0; i<n; i++) System.out.print((char)b[i]);
     
                 p.waitFor();//si l'application doit attendre a ce que ce process fini
     
             }catch(Exception e) {
                System.out.println("erreur d'execution " + cmd + e.toString());
             }
       }         
    }
    mais comment afficher le reste ?

    Une autre idée ?
    24 hours a day ... never enough

  5. #5
    Membre régulier Avatar de Vesperal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 81
    Points : 81
    Points
    81
    Par défaut
    Relis mon code, j'avais utilisé un bufferedReader, à partir d'un BufferedInputStream. Ca me permettait de lire ligne par ligne le résultat de la commande.

  6. #6
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut
    BufferedReader bf_reader= new BufferedReader(new InputStream(p.getInputStream());

    Change aussi e.toString() en e.getMessage().

  7. #7
    Membre habitué Avatar de horkets
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    326
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 326
    Points : 138
    Points
    138
    Par défaut
    j'avais déjà essayé de placer ce bout de code mais sans réussite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     String res="";
     
          BufferedReader bf_reader= new BufferedReader(reader);
          while (bf_reader.ready()) {
             res+=bf_reader.readLine()+"\n";
    mais j'obtiens une erreur à chaque coup ...

    voilà l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Exception in thread "main" java.lang.NullPointerException
    	at java.io.Reader.<init>(Unknown Source)
    	at java.io.BufferedReader.<init>(Unknown Source)
    	at java.io.BufferedReader.<init>(Unknown Source)
    	at DosQuery.main(DosQuery.java:28)
    24 hours a day ... never enough

  8. #8
    Membre habitué Avatar de horkets
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    326
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 326
    Points : 138
    Points
    138
    Par défaut
    En fait c'est la création du BufferedReader (new BufferedReader) qui plante ...

    Suis je obligé d'initialiser le reader ?
    24 hours a day ... never enough

  9. #9
    Membre régulier Avatar de be_tnt
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Points : 84
    Points
    84
    Par défaut
    Essaie:

    String s =null;

    while ((s = bf_reader.readLine()) != null) {
    // do whatever you want
    }

  10. #10
    Membre régulier Avatar de Vesperal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 81
    Points : 81
    Points
    81
    Par défaut
    le code que tu avais mis suppose que tu as fait avant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    InputStream i_stream=processus.getInputStream(); 
          InputStreamReader reader=new InputStreamReader(i_stream);
    sinon "reader" n'est pas défini, et le new BufferedReader(reader) plante.

  11. #11
    Membre habitué Avatar de horkets
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    326
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 326
    Points : 138
    Points
    138
    Par défaut
    Vos conseil m'aiguillent certainement dans le bon sens, seulement il y a quelque chose qui ne fonctionne pas
    Est ce que j'ordonne mal mes instructions ?
    Est ce qu'il me manquerais une librairie ?
    Mais que ce passe t'il ??

    Voici la code , peut etre y décellerai vous une erreur flagrante :

    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
     
    import java.io.*;
     public class DosQuery {    
        public static void main(String[] args) {
     
        	String cmd;
            cmd = "cmd /c ping localhost ";
     
            try {
                 Runtime r = Runtime.getRuntime();
                 Process p = r.exec(cmd);
     
                 InputStream i_stream = p.getInputStream();
                 InputStreamReader reader = new InputStreamReader(i_stream); 
     
                 InputStream out = new BufferedInputStream(p.getInputStream()); 
     
        	     //byte[] b = new byte[1024]; 
                 //int n = out.read(b);
                 //for(int i=0; i<n; i++) 
                 //System.out.print((char)b[i]);
     
                 String s =null;
     
                 BufferedReader bf_reader= new BufferedReader(reader); 
                 while ((s = bf_reader.readLine()) != null) {
                	 s = bf_reader.readLine()+"\n";
                	 System.out.println(s);
                 }
     
                 p.waitFor();//si l'application doit attendre a ce que ce process fini
     
             }catch(Exception e) {
                System.out.println("erreur d'execution " + cmd + e.getMessage());
             }
     
       } 
     
    }
    Dans ce cas ci , je ne vois meme pas la premiere ligne du ping ...
    24 hours a day ... never enough

  12. #12
    Membre habitué Avatar de horkets
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    326
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 326
    Points : 138
    Points
    138
    Par défaut
    Oups , c'est bon je pense avoir compris le truc Voilà ce qui me donne un résultat ...

    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
     
    import java.io.*;
     public class DosQuery {    
        public static void main(String[] args) {
     
        	String cmd;
            cmd = "cmd /c ping localhost ";
     
            try {
                 Runtime r = Runtime.getRuntime();
                 Process p = r.exec(cmd);
     
                 InputStream i_stream = p.getInputStream();
                 InputStreamReader reader = new InputStreamReader(i_stream); 
     
                 InputStream out = new BufferedInputStream(p.getInputStream()); 
     
                 String s =null;
     
                 BufferedReader bf_reader= new BufferedReader(reader); 
                 while ((s = bf_reader.readLine()) != null) {
            		 byte[] b = new byte[1024]; 
                     int n = out.read(b);
                     for(int i=0; i<n; i++) 
            		 System.out.print((char)b[i]);
                 }
     
                 p.waitFor();//si l'application doit attendre a ce que ce process fini
     
             }catch(Exception e) {
                System.out.println("erreur d'execution " + cmd + e.getMessage());
             }
       }      
    }
    J'obtiens maintenant tout l'affichage du ping mais avec beaucoup d'espaces blancs entre les lignes, ... Y aurait il un moyen de les supprimer ?

    En tout les cas ,

    GRAND MERCI
    24 hours a day ... never enough

  13. #13
    Membre régulier Avatar de Vesperal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 81
    Points : 81
    Points
    81
    Par défaut
    Parce que tu avais mal initialisé la chaîne. Du coup maintenant tu utilises un tableau de bytes, ce qui n'est pas la meilleure méthode je pense. Essaye de remplacer ton code actuel par ça (c'est le code que tu avais mis deux messages au dessus, mais corrigé)

    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
     
    import java.io.*; 
     public class DosQuery {    
        public static void main(String[] args) { 
     
           String cmd; 
            cmd = "cmd /c ping localhost "; 
     
            try { 
                 Runtime r = Runtime.getRuntime(); 
                 Process p = r.exec(cmd); 
     
                 InputStream i_stream = p.getInputStream(); 
                 InputStreamReader reader = new InputStreamReader(i_stream); 
     
                 InputStream out = new BufferedInputStream(p.getInputStream()); 
     
                //byte[] b = new byte[1024]; 
                 //int n = out.read(b); 
                 //for(int i=0; i<n; i++) 
                 //System.out.print((char)b[i]); 
     
                 String s =""; 
     
                 BufferedReader bf_reader= new BufferedReader(reader); 
                 while ((bf_reader.readLine() != null) { 
                    s += bf_reader.readLine()+"\n"; 
                    System.out.println(s); 
                 } 
     
                 p.waitFor();//si l'application doit attendre a ce que ce process fini 
     
             }catch(Exception e) { 
                System.out.println("erreur d'execution " + cmd + e.getMessage()); 
             } 
     
       } 
     
    }
    Sauf erreur ca devrait marcher, sans t'afficher de lignes en trop.

  14. #14
    Membre habitué Avatar de horkets
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    326
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 326
    Points : 138
    Points
    138
    Par défaut
    Désolé, mais cela ne fonctionne pas (j'ai fait un copié collé pour etre certain de rien oublié)
    Je suis contraint, pour le moment, d'utiliser des bytes et de les transformer ...
    24 hours a day ... never enough

  15. #15
    Membre régulier Avatar de Vesperal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 81
    Points : 81
    Points
    81
    Par défaut
    Je n'ai pas tappé le code sous un éditeur java, donc il est possible qu'il y ai des erreurs de syntaxe. N'hésites pas à poster l'erreur avec, qu'on puise t'aider à l'identifier

  16. #16
    Membre habitué Avatar de horkets
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    326
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 326
    Points : 138
    Points
    138
    Par défaut
    Je me suis emballé.
    Cela fonctionne en effet ( )
    J'utiliserai cete façon dorénavant, ceci dit, l'affichage ne m'indique tojours pas les caractères accentués.
    Y a t il quelque chose à faire dans le readLine() ou dans le sysout() ??
    24 hours a day ... never enough

  17. #17
    Membre régulier Avatar de Vesperal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 81
    Points : 81
    Points
    81
    Par défaut
    De manière générale les caractères accentués ne peuvent pas s'afficher sous Dos, donc je ne sais pas s'ils sont considérés comme des caractères accentués par java quand il les récupère.

  18. #18
    Membre habitué Avatar de horkets
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    326
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 326
    Points : 138
    Points
    138
    Par défaut
    Sur Xp les accents y sont apparemment.

    Dès lors, comment pourrais je faire savoir à java que ce sont bien des caractères accentués ?

    Y a t'il un moyen de transformer les caractères récupérés en unicode ?
    24 hours a day ... never enough

  19. #19
    Membre régulier Avatar de Vesperal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 81
    Points : 81
    Points
    81
    Par défaut
    Oui, il suffit de faire Character.getNumericValue(char ton_caractère);

    Ca te retourne un entier qui correspond au code Unicode.

  20. #20
    Membre habitué Avatar de horkets
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    326
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2005
    Messages : 326
    Points : 138
    Points
    138
    Par défaut
    ça marche aussi avec des Strings ?
    24 hours a day ... never enough

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Exécution de plusieurs commandes DOS en java
    Par tomzdi dans le forum Général Java
    Réponses: 3
    Dernier message: 03/07/2013, 19h27
  2. Excécuter une commande Dos sous Java
    Par mina86 dans le forum Général Java
    Réponses: 2
    Dernier message: 31/05/2008, 12h01
  3. Exécuter une commande DOS en JAVA
    Par WerKa dans le forum Langage
    Réponses: 3
    Dernier message: 05/03/2008, 11h03
  4. comment recuperer le resultat d'une commande dos en java?
    Par trunks-tr dans le forum Général Java
    Réponses: 49
    Dernier message: 06/06/2006, 14h25
  5. commande dos sous java
    Par yann999 dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 12/05/2006, 14h18

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