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 :

Runtime.exec & double quote


Sujet :

Langage Java

  1. #1
    Membre habitué Avatar de yaraco
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 89
    Points : 150
    Points
    150
    Par défaut Runtime.exec & double quote
    Bonjour,

    Voici un petit souci que je rencontre:

    Je souhaite lancer un programme via java avec en argument le nom d'un autre programme, qui contient donc potentiellement des espaces.
    Je dois donc pour cela échapper le nom.

    Or ça ne marche jamais.

    Après quelques recherches, je suis donc tombé sur ce rapport de bug (6468220): http://bugs.sun.com/view_bug.do?bug_id=6468220

    On peut apercevoir dans ce rapport un FIX. Sauf que je ne sais pas l'implémenter, pourriez vous m'aider?

    Je ne souhaite pas directement toucher à la machine virtuelle, juste surcharger les bonnes classes.

    Les classes qui doivent être modifiées sont ProcessImpl.java et Runtime.java, dans java.lang.

    Je m'étais dit que je pouvais recréer ces classes à ma sauce,mais elles requièrent des classes privées, uniquement accessibles dans java.lang.

    Bref, quelqu'un aurait-il plus de visibilité que moi sur ce problème?
    Qqun pourrait me venir en aide?

    Merci d'avance pour toute aide!

  2. #2
    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
    Salut,


    Tu voudrais exécuter quelle commande ?
    Quel est ton code ?

    a++

  3. #3
    Membre habitué Avatar de yaraco
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 89
    Points : 150
    Points
    150
    Par défaut
    J'ai plus le code sous les yeux, mais c'est un Runtime.exec avec un tableau de string pour les arguments.

    Or un de ces arguments contient un nom de programme, avec des espaces.

    Genre l'argument en question: "-exe=Programme 3.0.exe" -> passe pas
    "-exe=Programme_3.0.exe" -> passe


    Et c'est précisément ça qui est embêtant. La solution provisoire que j'ai trouvé c'est de renommer provisoirement le programme, afin de passer du coup un nom sans espace, et après l'exécution de le renommer à nouveau comme initialement.

    Mais bon, d'une je trouve ça archi-moche, et de deux j'ai de temps à autre des erreurs dans mon programme qui me stressent (je ne sais pas si ça vient de là où de plus loin, pour la simple et bonne raison que je n'ai pas déterminé la reproductibilité du bug).

    Donc du coup je suis tombé sur ce rapport de bug de sun qui me semble correspondre, mais j'ai du mal à appliquer le fix.

    PS: Et le pourquoi de la chose: j'ai un exe à auto-patcher. J'ai donc un second programme que je lance, le premier se ferme, le second patche le 1er et le relance.

    PS2: je précise que j'ai essayé pas mal de combinaisons à coups de
    "-exe=\"Programme 3.0.exe\"", "\"-exe=Programme 3.0.exe\"", ...
    Rien ne marche, mais si j'en crois le rapport de soumission de bug, ce souci est connu.

    PS3: Et je n'ai pas accès au code du second programme, donc je ne peux pas passer la chose avec de multiples arguments.

  4. #4
    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 yaraco Voir le message
    Donc du coup je suis tombé sur ce rapport de bug de sun qui me semble correspondre, mais j'ai du mal à appliquer le fix.
    Ça n'a rien à voir : le bug concerne les double-quotes et non pas les espaces...

    Citation Envoyé par yaraco Voir le message
    PS2: je précise que j'ai essayé pas mal de combinaisons à coups de
    "-exe=\"Programme 3.0.exe\"", "\"-exe=Programme 3.0.exe\"", ...
    Rien ne marche, mais si j'en crois le rapport de soumission de bug, ce souci est connu.
    Il ne faut pas essayer toutes les combinaisons... Il faut passer les arguments séparément via exec(String[]) (ou ProcessBuilder).

    Le commande suivante :
    Code shell : Sélectionner tout - Visualiser dans une fenêtre à part
    programme arg1 "arg 2"
    S'écrit de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Process p = Runtime.exec("programme", "arg1", "arg 2");
    Maintenant sans avoir la ligne de commande originelle difficile de t'aider plus...

    a++

  5. #5
    Membre habitué Avatar de yaraco
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 89
    Points : 150
    Points
    150
    Par défaut
    Si, je m'exprime effectivement mal, mais ça a à voir. Je veux les doubles-quotes parce qu'il y a des espaces dans mon argument et si je ne les met pas, il sera plus tard mal interprété du fait de ces espaces.

    Je reposterai demain le code quand j'y aurai accès, mais j'utilise la syntaxe que tu as posté:
    Process p = Runtime.exec("programme", "arg1", "arg 2");
    Il y aura juste un argument avec des espaces dedans, mettons arg2 sera remplacé par: -prp="nom de programme avec espace". qui sera mal interprété.

    Et cela est du au fait si j'ai bien compris que les doubles quotes ne sont pas correctement passées dans les arguments.

    Je complète ce post demain, bonne soirée!

  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
    Tu ne devrais pas avoir besoin des quotes puisques tu sépares déjà les arguments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Process p = Runtime.exec("programme", "arg1", "-prp=nom de programme avec espace");
    Sauf erreur en ligne de commande les quotes sont traitées et supprimées par le shell

    a++

  7. #7
    Membre habitué Avatar de yaraco
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 89
    Points : 150
    Points
    150
    Par défaut
    Bon, tout d'abord, le programme que je souhaite lancer est
    UpdateRsrcJavaExe, disponible à cette adresse: http://devwizard.free.fr/html/fr/JavaExe.html

    Utilisable et distribuable, mais non modifiable.

    ligne de commande pour le lancer via l'invite de commande windows:
    UpdateJavaExe.exe -run -prp="Nom avec espaces.properties" -exe=programme.exe

    J'essaye maintenant de faire de même en java:

    Alors, voilà la ligne incriminée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Process UpdateJavaExe = runtime.exec(new String[]{"UpdateRsrcJavaExe.exe",
                "-run",
                "-prp=Nom avec espaces.properties",
                "-exe=programme.exe"});
    Résultat obtenu par un message d'erreur de ce programme:
    Fichiers sources non spécifiés.
    Cela correspond à mon fichier: Nom avec espace.properties et signifie qu'il ne l'a pas trouvé.

    Maintenant examinons ce qui est envoyé au programme un programme en C codé en 15 secondes des plus basiques qui affiche les arguments envoyés grâce à argc et argv:
    1: -run
    2: -prp=Nom avec espaces.properties
    3: -exe=programme.exe
    Tout semble donc parfait du côté des arguments

    UpdateJavaExe comprend donc mal cette chaine.

    Je me dis que je vais donc appliquer la même stratégie que quand je lance ce programme à la main dans l'invite de commande windows, à savoir échapper Nom avec espace.properties:
    -prp="Nom avec espace.properties"

    Je modifie donc ma ligne de lancement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Process UpdateJavaExe = runtime.exec(new String[]{"UpdateRsrcJavaExe.exe",
                "-run",
                "-prp=\"Nom avec espaces.properties\"",
                "-exe=programme.exe"});
    Résultat: Fichiers sources non spécifiés.

    Je ne suis pas plus avancé. Par contre observons toujours grâce à mon programme C ce qui a été lancé en arguments:
    1: -run
    2: -prp=Nom
    3: avec
    4: espaces.properties
    5: -exe=programme.exe
    Hum, pas vraiment ce que j'aurais espéré, à savoir: -prp="Nom avec espace.properties" en argument 2.

    Maintenant tentons le double échappement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Process UpdateJavaExe = runtime.exec(new String[]{"UpdateRsrcJavaExe.exe",
                "-run",
                "-prp=\\\"Nom avec espaces.properties\\\"",
                "-exe=programme.exe"});
    Résultat: Fichiers sources non spécifiés

    Arguments captés par mon programme de tests:
    1: -run
    2: -prp="Nom avec espace.properties"
    3: -exe=programme.exe
    Hum, mais ça me semblait pourtant pas mal du tout ça!

    Bref, je ne comprends pas pourquoi ça ne marche pas. Je sais que je ne comprend pas tout au niveau du degré d'échappement au sein des différents "lanceurs", mais il me semblait pourtant ici avoir tenté tous les cas.

    Ce que je veux simplement, c'est reproduire la ligne que je tape dans l'invite de commande windows en java:
    UpdateRsrcJavaExe.exe -run -prp="Nom avec espaces.properties" "-exe=Programme.exe" et qui marche bien.

    Et si je lance mon programme capteur d'arguments avec une ligne de commande de ce type, programme -run -prp="Nom avec espaces.properties", j'obtiens comme résultat: -prp=Nom avec espace.properties, ce qui correspond normalement au premier test effectué (mais ce résultat m'est donné par l'invite de commandes, y'a t'il des caractères échappés sans que je le vois?).

    Du coup je nage pas mal, et je comprendrais parfaitement que personne n'ai envie de lire mon pavé. ^^

    Mais si qqun est arrivé jusqu'à là, comprend il le problème insoluble pour le petit néophyte que je suis?

    Arrivez vous à mieux cerner mon problème?
    Cela a-t-il vraiment à voir avec le bug que j'ai remonté ou alors je m'égare?

  8. #8
    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 yaraco Voir le message
    Alors, voilà la ligne incriminée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Process UpdateJavaExe = runtime.exec(new String[]{"UpdateRsrcJavaExe.exe",
                "-run",
                "-prp=Nom avec espaces.properties",
                "-exe=programme.exe"});
    Résultat obtenu par un message d'erreur de ce programme:
    Fichiers sources non spécifiés.
    Cela correspond à mon fichier: Nom avec espace.properties et signifie qu'il ne l'a pas trouvé.
    Es-tu sûr d'être dans le bon répertoire pour ton chemin relatif ?
    As-tu essayé avec un chemin absolu ?

    a++

  9. #9
    Membre habitué Avatar de yaraco
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 89
    Points : 150
    Points
    150
    Par défaut
    Oui, et oui.

    bon chemin relatif: j'en ai la preuve dans le fonctionnement de mon application pour le moment: je stocke le nom initial, je remplace les espaces par des "_", et je lance le programme avec ce nouveau nom.
    Puis quand UpdateRsrcJavaExe a finit son traitement, je redonne à mon fichier son nom initial.

    C'est moche, mais j'arrive pas pour le moment à le faire autrement.

    Et pour le chemin absolument, ça ne marche pas plus (ni moins ^^).

  10. #10
    Membre habitué Avatar de yaraco
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 89
    Points : 150
    Points
    150
    Par défaut
    Je passe ce topic en résolu ayant depuis compris d'où venait mon problème.

    Le programme que j'essayais d'appeler n'a pas une gestion des arguments très conventionnelle, et c'est de la que venait mes soucis.

    J'ai pu résoudre cela en utilisant runtime.exec avec un simple string correctement échappé et non un tableau de string comme auparavant.

    En espérant que si un autre néophyte tombe un jour sur le même problème que moi ce topic lui permette de ne pas perdre de temps!

    Merci encore pour votre aide.

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

Discussions similaires

  1. [RUNTIME][EXEC]
    Par adrien1977 dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 30/09/2009, 16h28
  2. Réponses: 15
    Dernier message: 21/02/2007, 17h29
  3. [Servlet][Windows][System call]Runtime.exec
    Par lucho31 dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 18/01/2005, 11h55
  4. Réponses: 4
    Dernier message: 05/07/2004, 13h17
  5. [Système][Runtime][Exec] Comportement étrange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2004, 09h54

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