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

Langage Java Discussion :

execution d'une commande externe


Sujet :

Langage Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 206
    Points : 81
    Points
    81
    Par défaut execution d'une commande externe
    Bonsoir,

    Je me tourne vers vous pour esssayer de comprendre pourquoi le bout de code suivant pour lancer des commandes n'execute pas mon script jusqu'au bout :

    Je suis sous win xp.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    try 
    {
    Runtime r = Runtime.getRuntime();
    Process p = r.exec(cmd /c c:\\script.bat);
    }
    catch(Exception e) 
    {
    System.out.println("erreur d'execution " + e.toString());
    }
    dand mon script.bat j'ai un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    cd c:\repertoire\dev
    svn commit -F monfichier.php --force-log
    cd c:\repertoire\dev2
    svn commit -F monfichier2.php --force-log
    Bien sur si je lance mon fichier.bat normalement (double clique, il s'execute jusqu'au bout)

    Merci de votre aide

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 333
    Points : 295
    Points
    295
    Par défaut
    Le probléme est que le point bat s'execute là où s'execute ton code java et non là où se trouve ton .bat

    la solution est d'imposer le repertoire d'execution du bat avec la méthode :

    exec(String[] cmdarray, String[] envp, File dir)

    et un appel du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    File dir = new File( "c:\\") ;	
    String temp[]={"cmd", "/c", " c:\\script.bat"};	
    Runtime.getRuntime().exec(temp,null,dir);

  3. #3
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    de plus en cherchant un peu tu verras que cette question revient 2 3 fois par jour. Du coup d'autres posts sont déjà très détaillés à ce sujet.

    Je te conseille d'aller voir la FAQ, il est est expliqué tout ça et en particulier la gestion des différents flux.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 206
    Points : 81
    Points
    81
    Par défaut
    Ok, merci !
    Et désolé, pourtant, j'ai cherché...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 206
    Points : 81
    Points
    81
    Par défaut
    Je viens de tester, la soluce, ca ne marche pas...

    J'ai ajouter les flux d'entrée et sortie comme suit :

    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
     
    		// compression
    		File dir = new File("") ;	
    		String absolutePath="";
    		absolutePath=dir.getAbsolutePath()+"\\bin";
    		String temp[]={"cmd.exe", "/C", absolutePath+"\\archive.bat"};	
    		try 
    		{
    			Runtime r = Runtime.getRuntime();
    			Process p = r.exec(temp,null,absolutePath);
    			java.io.BufferedReader ds = new java.io.BufferedReader(new java.io.InputStreamReader( p.getInputStream() ) ); 
    			String slineCourante = ds.readLine();
    			while (slineCourante != null) 
    			{ 
    			      System.out.println(slineCourante);
    			      slineCourante = ds.readLine(); 
    			}
    		}
    		catch(Exception e) 
    		{
    			System.out.println("erreur d'execution " +e.toString());
    			return false;
    		}
    et dans mon archive.bat, j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    7z u "c:\archive.zip" "c:\dossier_a_archiver"
    S'il vous plait ne dite pas que j'ai pas cherché, c'est pas facile, quand on ne sait pas où chercher, c'est à dire quand on ne sait pas d'où vient le problème...

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par crazykangourou
    S'il vous plait ne dite pas que j'ai pas cherché, c'est pas facile, quand on ne sait pas où chercher, c'est à dire quand on ne sait pas d'où vient le problème...
    Alors imagine un peu pour nous lorsqu'on a comme seule et unique info "ca marche pas" !!!


    De plus si tu ne lis pas le flux d'erreur et que tu n'utilises pas le flux d'entrée, tu devrais les fermer juste après avori créer le process (mais tu risque de perdre les éventuelles erreurs affiché par ton script).

    Un peu de lecture :


    a++

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 206
    Points : 81
    Points
    81
    Par défaut
    J'ai ajouter la fermeture de mon flux, mais je n'obtiens toujours pas ma compression :

    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
     
    		// compression
    		File dir = new File("") ;	
    		String absolutePath="";
    		absolutePath=dir.getAbsolutePath()+"\\bin";
    		String temp[]={"cmd.exe", "/C", absolutePath+"\\archive.bat"};	
    		try 
    		{
    			Runtime r = Runtime.getRuntime();
    			Process p = r.exec(temp,null,absolutePath);
    			java.io.BufferedReader ds = new java.io.BufferedReader(new java.io.InputStreamReader( p.getInputStream() ) ); 
    			String slineCourante = ds.readLine();
    			while (slineCourante != null) 
    			{ 
    			      System.out.println(slineCourante);
    			      slineCourante = ds.readLine(); 
    			}
                            ds.close();
    			// Fermeture des flux :
    			p.getOutputStream().close();
    			p.getInputStream().close();
    			p.getErrorStream().close();
    		}
    		catch(Exception e) 
    		{
    			System.out.println("erreur d'execution " +e.toString());
    			return false;
    		}
    Par contre si je remplace le code dans mon archive.bat par
    La création du répertoire se fait bien.

    C'est ça que je ne comprend pas!!

    Ca veut dire que le buffer est bloqué?
    Donc, que faut t il que je fasse ?

    PS : adiGuba, je commence en Java... Est ce qu'il faut absolument tous les flux entrée, sortie, erreur ?
    Comment on fait pour intégrer ton api? shell.jar?

    Merci

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 333
    Points : 295
    Points
    295
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String absolutePath="";
    absolutePath=dir.getAbsolutePath()+"\\bin";
    tu execute ton script dans un dossier bin
    est ce que tu as essayé d'éxécuter le bat manuellement à cet endroit ?

    essaye d'afficher aussi p.getErrorStream()

  9. #9
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par crazykangourou
    Ca veut dire que le buffer est bloqué?
    Ou qu'une erreur survient dans ton script !

    Citation Envoyé par crazykangourou
    Donc, que faut t il que je fasse ?
    Déjà il faudrait au moins traiter le flux d'erreur pour voir s'il y a un problème. Cette lecture doit se faire dans un thread (voir le tuto pour cela)

    Citation Envoyé par crazykangourou
    Est ce qu'il faut absolument tous les flux entrée, sortie, erreur ?
    Oui : il faut traiter tous les flux, ou bien les fermer si tu ne les utilises pas.
    Si tu fermes le flux d'erreur ou de sortie tu perdras les éventuelles messages, mais cela ne bloquera pas le process...


    Citation Envoyé par crazykangourou
    Comment on fait pour intégrer ton api? shell.jar?
    Il suffit de placer le jar dans le CLASSPATH...
    Ce qui dépend de ton environnement de compilation (par exemple en mode console : CLASSPATH).

    a++

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 206
    Points : 81
    Points
    81
    Par défaut
    Pour les messages du process, j'ai réussi à lire les message d'erreur avec p.getErrorStream()

    et le message est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '7z' n'est pas reconnu en tant que commande interne


    Vraiment désolé, c'est ça que j'aurais du faire dès le début!!!
    Pourtant, c'est un script.bat que je demande d'executer et c'est ce script qui devait se charger de faire le reste

    COmment fais je dans ce cas là ?

Discussions similaires

  1. Problème à l'execution d'une commande externe
    Par lucaskywalker dans le forum Général Python
    Réponses: 15
    Dernier message: 04/11/2011, 10h53
  2. [Système] executer une commande externe depuis php
    Par sebgaillard dans le forum Langage
    Réponses: 1
    Dernier message: 09/04/2008, 16h34
  3. [Système]Execution d'une commande shell
    Par n8ken dans le forum API standards et tierces
    Réponses: 24
    Dernier message: 29/03/2007, 05h36
  4. [Système] Pb exécution d'une commande externe
    Par licorne dans le forum Langage
    Réponses: 9
    Dernier message: 19/10/2005, 17h34
  5. [System][EXEC] Probleme d'execution avec une commande parametrée.
    Par chicorico dans le forum Général Java
    Réponses: 15
    Dernier message: 20/05/2005, 16h07

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