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

API standards et tierces Java Discussion :

[Runtime] Récupération d'une variable fixée dans un .bat


Sujet :

API standards et tierces Java

  1. #1
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut [Runtime] Récupération d'une variable fixée dans un .bat
    Bonjour,

    J'aimerai savoir s'il est possible de récupérer une variable affectée dans un .bat qui est lui-même lancé par mon application Java 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
     
    public class MaClasse extends JFrame {
       static {
          try {
                Runtime run = Runtime.getRuntime();
                Process p = run.exec("lib\\initializer.bat");
                // Comment récupérer une variable initialisée dans le .bat pour l'utiliser ici, afin de faire un System.setProperty()?
          }
          catch (IOException e) {
                e.printStackTrace(); 
          }
     
          [...]
    }
    Merci d'avance!

  2. #2
    in
    in est déconnecté
    Membre Expert 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
    Par défaut
    je dis ça un peu au pif mais ...

    ça dépend de comment tu crée la variable, si tu as un SET LOCAL par exemple je pense que ce n'est pas possible (enfin une déclaration locale à ce processus).

    Il faut vraiment créer cette variable comme variable d'environnement et du coup la récupérer comme telle (ça je crois que c'est possible). Comme la variable est créée par un processus et lue par un autre, je ne sais pas si chaque processus à ces propres valeurs de variables d'environnement (avec SET LOCAL par exemple) ou si ces valeurs sont partagées ...

    voilà, je sais pas si ça aide ...

  3. #3
    Membre chevronné
    Avatar de karami
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Juin 2005
    Messages : 343
    Par défaut
    Citation Envoyé par in
    je dis ça un peu au pif mais ...

    ça dépend de comment tu crée la variable, si tu as un SET LOCAL par exemple je pense que ce n'est pas possible (enfin une déclaration locale à ce processus).

    Il faut vraiment créer cette variable comme variable d'environnement et du coup la récupérer comme telle (ça je crois que c'est possible). Comme la variable est créée par un processus et lue par un autre, je ne sais pas si chaque processus à ces propres valeurs de variables d'environnement (avec SET LOCAL par exemple) ou si ces valeurs sont partagées ...

    voilà, je sais pas si ça aide ...
    Si j ai bien compris ta question, je croix que tu peux executer la commande directement en java (pas besoin du fichier bat) et récuperer le résultat.

  4. #4
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Ben à vrai dire, je ne sais pas trop : je ne suis pas un pro du DOS.
    Le .bat fait ça pour affecter la variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set PROPERTIES=init.properties
    Et normalement, je dois appeler mon appli en faisant ça dans un autre .bat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    call .\lib\set_variables.bat
    java -Xms64M -Xmx400M -XX:GCHeapFreeLimit=1 -DPROPERTIES=%PROPERTIES% -classpath monAppli.jar dev.awt.monAppli
    exit
    On est donc obligé d'appeler ce .bat pour lancer l'initialisation de variables nécessaires à l'utilisation de dll par mon appli.

    Mais comme on aimerait lancer notre appli via un .exe (à l'aide de JavaExe), il faudrait intégrer l'affectation de cette variable dans notre appli. D'où la tentative d'appel du .bat et d'affection (via un System.setPtoperty())dans la clause static.

    Mais là, je m'égare un peu...

  5. #5
    Membre éprouvé
    Avatar de moritan
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2005
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2005
    Messages : 687
    Par défaut
    Si le .bat ne fait que de l'affectation de variable d'environnement, il y a moyen de le remplacer par un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.setProperty("PROPERTIES", "init.properties");
    Autre question pourquoi faire un call d'un bat dans un autre et pas tout mettre dans le même??

  6. #6
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Ok merci, je vais tester.

  7. #7
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Bon, en fait, j'ai l'impression que mon problème est encore plus profond que ça : on dirait que le .bat ne se lance pas.
    Alors j'ai créé un .bat tout con, qui fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @echo off
    echo toto
    pause
    Et je l'appelle dans une clause static de ma classe principale (celle contenant le main) comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    try {
    	Runtime run = Runtime.getRuntime();
    	Process p = run.exec("test.bat");
    } catch (IOException e) {
    	System.out.println("Erreur d'initialisation : paramètre incorrect.\n " + e.toString()); 
    	e.printStackTrace();
    }
    J'ai aussi essayé de faire ça dans la méthode main() mais le résultat est le même : zéro affichage dans la console...

    Quelqu'un pourrait-il m'éclairer sur l'appel de .bat dans du code Java?
    Merci d'avance.

  8. #8
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    @echo off, c'est pas justement pour qu'il n'y aie rien qui s'affiche ?

    Essaie sans...

  9. #9
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Il me semble qu'un fichier .bat n'est pas considéré comme un programme à part entière. Tu dois le lancer via l'application cmd :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Process p = run.exec(new String[] { "cmd", "/C", "C:\\chemin\\test.bat" });
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  10. #10
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Citation Envoyé par wichtounet
    @echo off, c'est pas justement pour qu'il n'y aie rien qui s'affiche ?

    Essaie sans...
    Non,
    sert à ce que la commande que l'on exécute ne s'affiche pas, mais le résultat lui s'affiche.

    Par exemple si tu as le .bat cela affichera
    prompt>dir
    résultat de dir
    tandis que le .bat affichera
    résultat de dir
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  11. #11
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Non c'est pareil.
    "Echo off" sert à ne pas afficher les lignes de commandes tapées, mais laisse le "flux de sortie" s'afficher...

  12. #12
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    En fait c'est normal que rien ne s'affiche sur la sortie standard puisque Java récupère les divers flux de l'application.
    Tu dois d'abord récupérer le flux de sortie du processus (via la méthode getInputStream() de la classe Process) puis afficher ce que tu lis vers System.in.

    Remarque : Lorsque tu lance une application externe il est important de traiter les trois fluxs (in, err, out) et ce dans des threads différents.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  13. #13
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Citation Envoyé par le y@m's
    Il me semble qu'un fichier .bat n'est pas considéré comme un programme à part entière. Tu dois le lancer via l'application cmd :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Process p = run.exec(new String[] { "cmd", "/C", "C:\\chemin\\test.bat" });
    Juste pour savoir : à quoi sert le paramètre "/C"?

  14. #14
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Citation Envoyé par seiryujay
    Juste pour savoir : à quoi sert le paramètre "/C"?
    Citation Envoyé par cmd /?
    Démarre une nouvelle instance de l'interpréteur de commandes de Windows XP

    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
    ...
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  15. #15
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Citation Envoyé par le y@m's
    En fait c'est normal que rien ne s'affiche sur la sortie standard puisque Java récupère les divers flux de l'application.
    Tu dois d'abord récupérer le flux de sortie du processus (via la méthode getInputStream() de la classe Process) puis afficher ce que tu lis vers System.in.

    Remarque : Lorsque tu lance une application externe il est important de traiter les trois fluxs (in, err, out) et ce dans des threads différents.
    Moi je veux bien, mais la seule chose que j'arrive à afficher c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.io.FileInputStream@1ef9f1djava.io.BufferedInputStream@1764be1java.io.BufferedOutputStream@16fd0b7
    En faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    System.out.print(p.getInputStream());
    System.out.print(p.getOutputStream());
    System.err.print(p.getErrorStream());

  16. #16
    Membre éprouvé
    Avatar de moritan
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2005
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2005
    Messages : 687
    Par défaut
    Un stream n'est pas une String regarde dans la FAQ comment manipuler les flux...

  17. #17
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Tu as mal compris ce que je voulais dire .
    tu dois lire les données du flux récupéré avec getInputStream() et ce sont ces données que tu dois écrire sur la sortie standard.
    Un truc dans le genre :
    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
    Process p = run.exec(new String[] { "cmd", "/C", "C:\\chemin\\test.bat" });
    final BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
    final BufferedReader err = new BufferedReader(new InputStreamReader(process.getErrorStream()));
    
    // Traitement du flux de sortie de l'application externe
    new Thread(new Runnable() {
        public void run() {
            try {
                String line = "";
                try {
                    // on lit le flux de sortie de l'application externe
                    while((line = in.readLine()) != null) {
                        // si quelque chose de lu, on l'affiche dans la sortie standard
                        System.out.println(line);
                    }
                } finally {
                     in.close();
                }
            } catch(IOException ioe) {
                ioe.printStackTrace();            
            }
        }
    }).start();
                
    // Traitement du flux d'erreur de l'application externe
    new Thread(new Runnable() {
        public void run() {
            try {
                String line = "";
                try {
                    // on lit le flux d'erreur de l'application externe
                    while((line = err.readLine()) != null) {
                        // si quelque chose de lu, on l'affiche dans la sortie standard
                        System.out.println("ERROR : " + line);
                    }
                } finally {
                     err.close();
                }
            } catch(IOException ioe) {
                ioe.printStackTrace();            
            }
        }
    }).start();
    Ce code ne gère pas l'écriture sur le flux d'entrée de l'application externe.

    PS : Je te conseille ce tutoriel sur le package java.io pour te familiariser avec les fluxs d'entrée/sortie .
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  18. #18
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Citation Envoyé par le y@m's
    Tu as mal compris ce que je voulais dire .
    tu dois lire les données du flux récupéré avec getInputStream() et ce sont ces données que tu dois écrire sur la sortie standard.
    Un truc dans le genre :
    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
    Process p = run.exec(new String[] { "cmd", "/C", "C:\\chemin\\test.bat" });
    final BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
    final BufferedReader err = new BufferedReader(new InputStreamReader(process.getErrorStream()));
    
    // Traitement du flux de sortie de l'application externe
    new Thread(new Runnable() {
        public void run() {
            try {
                String line = "";
                try {
                    // on lit le flux de sortie de l'application externe
                    while((line = in.readLine()) != null) {
                        // si quelque chose de lu, on l'affiche dans la sortie standard
                        System.out.println(line);
                    }
                } finally {
                     in.close();
                }
            } catch(IOException ioe) {
                ioe.printStackTrace();            
            }
        }
    }).start();
                
    // Traitement du flux d'erreur de l'application externe
    new Thread(new Runnable() {
        public void run() {
            try {
                String line = "";
                try {
                    // on lit le flux d'erreur de l'application externe
                    while((line = err.readLine()) != null) {
                        // si quelque chose de lu, on l'affiche dans la sortie standard
                        System.out.println("ERROR : " + line);
                    }
                } finally {
                     err.close();
                }
            } catch(IOException ioe) {
                ioe.printStackTrace();            
            }
        }
    }).start();
    Ce code ne gère pas l'écriture sur le flux d'entrée de l'application externe.

    PS : Je te conseille ce tutoriel sur le package java.io pour te familiariser avec les fluxs d'entrée/sortie .
    Ca s'est vu que je ne maîtrisé pas les flux?
    Merci, ça devrait m'aider!

  19. #19
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Ok! ca marche!
    Enfin, le .bat est bien lancé et s'exécute correctement...
    Merci!

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/05/2009, 23h22
  2. Récupération d'une variable javascript dans une feuille XSL
    Par drakkar64 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 21/08/2008, 17h56
  3. Réponses: 5
    Dernier message: 25/05/2007, 10h22
  4. Réponses: 5
    Dernier message: 08/10/2006, 15h28
  5. [Conception] récupération d'une variable php dans une autre page
    Par vali7 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 18/01/2006, 11h19

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