Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Probleme avec Runtime.exec(String)

5 réponses
Avatar
Nico
Bonjour,

J'ai un petit problème avec Runtime.exec(String). D'après la doc, il
semblerait que le chaine passée en paramètres soit découpée en tokens
uniquement selon les caractères blancs, ce qui me pose un problème pour les
commandes du type : monProgramme "Repertoire avec espaces/monFichier".
Dans tous les OS, une ligne de commande de ce type tapée dans une console
est découpée en deux arguments <monProgramme> et <"Repertoire avec
espaces/monFichier">.
Mais d'après la doc, en Java, la ligne de commande est découpée en 4
arguments <monProgramme>, <"Repertoire>, <avec> et <espaces/monFichier"> ce
qui bien évidemment me pose problème pour exécuter une commande saisie par
l'utilisateur dans une boîte de dialogue.

Quelqu'un aurait une idée pour découper correctement cette chaine de
caracteres ?
Merci d'avance

== extrait de la doc de Runtime.exec(String) :
The command argument is parsed into tokens and then executed as a command in
a separate process. The token parsing is done by a StringTokenizer created
by the call: new StringTokenizer(command) with no further modifications of
the character categories. This method has exactly the same effect as
exec(command, null).

== extrait de la doc de StringTokenizer(String):
Constructs a string tokenizer for the specified string. The tokenizer uses
the default delimiter set, which is " \t\n\r\f": the space character, the
tab character, the newline character, the carriage-return character, and the
form-feed character. Delimiter characters themselves will not be treated as
tokens.

5 réponses

Avatar
nioubi
Nico wrote:
Quelqu'un aurait une idée pour découper correctement cette chaine de
caracteres ?


Bonjour,
je pense qu'il faudrait
1) parser toi-meme la chaine selon ton besoin pour isoler chaque argument
2) utiliser la variante : exec(String[] cmdarray) qui permet de
fournir la commande et les arguments tels quels dans un tableau

Avatar
Nico
"nioubi" a écrit
Nico wrote:
Quelqu'un aurait une idée pour découper correctement cette chaine de
caracteres ?


Bonjour,
je pense qu'il faudrait
1) parser toi-meme la chaine selon ton besoin pour isoler chaque argument
2) utiliser la variante : exec(String[] cmdarray) qui permet de
fournir la commande et les arguments tels quels dans un tableau


C'est ce que j'ai fini par faire mais ca ne regle pas mon probleme en fait.
Voila mon probleme : j'essaye de lancer povray (un logiciel gratuit de
raytracing, www.povray.org),
la ligne de commande est censée contenir les arguments suivants :
1: C:Program FilesPovraybinpvengine.exe
2: +I'C:Documents and SettingsAdministrateurMes Documentsfichier.pov'
3: +O'C:Documents and SettingsAdministrateurMes Documentsfichier.tga'
4: +D
5: +W800
6: +H600

C'est ce que je lui passe à exec(String[]) et çà marche très bien sous
windows, mais quelqu'un d'autre qui utilise le programme sous Linux me dite
que ca ne marche pas dès que l'on met les simple quotes (pour les espaces)
sur les options +I et +O. Alors qu'en recopiant la ligne de commande telle
quelle dans un shell, ca marche. C'est à cause du problème sous Linux que
j'ai essayé exec(String[]) au lieu de exec(String) qui ne marchait pas non
plus sous Linux.

Quelqu'un aurait une idée ?
Je trouve ca vraiment étrange que ca ne marche pas sous Linux.

Nicolas


Avatar
nioubi
Nico wrote:
la ligne de commande est censée contenir les arguments suivants :
1: C:Program FilesPovraybinpvengine.exe
2: +I'C:Documents and SettingsAdministrateurMes Documentsfichier.pov'
3: +O'C:Documents and SettingsAdministrateurMes Documentsfichier.tga'
4: +D
5: +W800
6: +H600
La doc pour win et linux parle de quotes. Qu'est ce que ça donne avec

des doubles quotes (au besoin en faisant un remplacement selon l'os
d'acceuil) ?

Et bien sur attention au sens des / au lieu des p... de sous windows.

Alors qu'en recopiant la ligne de commande telle
quelle dans un shell, ca marche. C'est à cause du problème sous Linux que
j'ai essayé exec(String[]) au lieu de exec(String) qui ne marchait pas non
plus sous Linux.
Beuh sinon je passe mon tour.


Avatar
Nico
"nioubi" a écrit
Nico wrote:
la ligne de commande est censée contenir les arguments suivants :
1: C:Program FilesPovraybinpvengine.exe
2: +I'C:Documents and SettingsAdministrateurMes
Documentsfichier.pov'


3: +O'C:Documents and SettingsAdministrateurMes
Documentsfichier.tga'


4: +D
5: +W800
6: +H600
La doc pour win et linux parle de quotes. Qu'est ce que ça donne avec

des doubles quotes (au besoin en faisant un remplacement selon l'os
d'acceuil) ?


J'ai essayé aussi les doubles quotes, c'etait mon essai précédent, ca ne
marche pas mieux :(

Et bien sur attention au sens des / au lieu des p... de sous windows.


Oui je sais mais la ligne de commande est créée dans un fenêtre Swing en
choisissant avec un JFileChooser l'emplacement de l'exe et du répertoire de
travail, et avec des champs de saisie pour les autres options. Donc je ne
m'occupe pas des / ou des , c'est le JFileChooser qui choisit.

Alors qu'en recopiant la ligne de commande telle
quelle dans un shell, ca marche. C'est à cause du problème sous Linux
que


j'ai essayé exec(String[]) au lieu de exec(String) qui ne marchait pas
non


plus sous Linux.
Beuh sinon je passe mon tour.



Merci pour les réponses


Avatar
JScoobyCed
Nico wrote:

C'est ce que je lui passe à exec(String[]) et çà marche très bien sous
windows, mais quelqu'un d'autre qui utilise le programme sous Linux me dite
que ca ne marche pas dès que l'on met les simple quotes (pour les espaces)
sur les options +I et +O. Alors qu'en recopiant la ligne de commande telle
quelle dans un shell, ca marche. C'est à cause du problème sous Linux que
j'ai essayé exec(String[]) au lieu de exec(String) qui ne marchait pas non
plus sous Linux.

Quelqu'un aurait une idée ?
Je trouve ca vraiment étrange que ca ne marche pas sous Linux.

Nicolas




Pourriez vous poster dans ce cas une ligne de commande valide pour linux
? (Je doute que c:... soit votre ligne de commande).
Ne pouvez-vous pas utiliser les double quotes ?

--
JScoobyCed