Lancement de processus par open

Le
Eric C.
Bonjour à tous,

Je cherche à lancer des processus via "open+pipe", sur un poste
Windows.
Le seul point délicat à gérer concerne la présence d'espaces dans l=
e
chemin d'accès à mon exécutable, et la consultation du fil http://bit=
.ly/fKvxLM
m'a permis de trouver des solutions pour gérer les arguments multiples
(la solution proposée par Paul Gaborit - syntaxe étendue d'open, avec
passage d'arguments en liste - n'est apparemment pas implémentée dans
mon perl 5.10)

Ci-dessous mes quelques tests, qui fonctionnent tous comme prévu sauf
le dernier :quelqu'un peut-il m'expliquer pourquoi l'appel n°5 redonne
le msg "'C:Program' n'est pas reconnu en tant que commande interne
bla bla " que les solutions 3 et 4 permettent de contourner ?

use strict;
use File::Spec::Functions;
use Cwd;

my $cmd= 'C:Program FilesInternet Exploreriexplore.exe';
my $file = catfile(cwd(),'z.html');

# open SORTIE,$cmd." |"; # 1 : OK
# open SORTIE,$cmd." ".$file." |"; # 2 : NOK
# open SORTIE,""$cmd" ".$file." |"; # 3 : OK
# open SORTIE,""$cmd" $file |"; # 4 :OK
my $ligne = $cmd." ".$file;
open SORTIE,""$ligne" |"; # 5 : NOK ?
while (<SORTIE>) {
#
}
close SORTIE;


Merci,

Eric
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Paul Gaborit
Le #23300461
À (at) Thu, 21 Apr 2011 03:04:41 -0700 (PDT),
"Eric C."
Le seul point délicat à gérer concerne la présence d'espaces dans le
chemin d'accès à mon exécutable, et la consultation du fil http://bit.ly/fKvxLM
m'a permis de trouver des solutions pour gérer les arguments multiples
(la solution proposée par Paul Gaborit - syntaxe étendue d'open, avec
passage d'arguments en liste - n'est apparemment pas implémentée dans
mon perl 5.10)

Ci-dessous mes quelques tests, qui fonctionnent tous comme prévu sauf
le dernier :quelqu'un peut-il m'expliquer pourquoi l'appel n°5 redonne
le msg "'C:Program' n'est pas reconnu en tant que commande interne
bla bla ..." que les solutions 3 et 4 permettent de contourner ?



En tout premier lieu, N'UTILISEZ PAS DE BACKSLASH pour les chemins
Windows. Refaites *tous* vos tests en utilisant des chemins du type :

my $path = "C:/Progam Files/...";

Cela fait très longtemps que Windows accepte autant le "" que le "/"
comme séparateur.

Si certains problèmes persistent, revenez alors nous en parler. ;-)

--
Paul Gaborit - Perl en français -
Eric C.
Le #23300551
Je sais ... :)
... mais dans la vraie vie je récupère le nom de mon exe dans un
fichier ascii exporté depuis une appli tierce, où il est tout à fait
possible que l'utilisateur ait renseigné un chemin avec backslashs.
Certes, je pourrais effectuer la conversion en amont ...
... mais le même test effectué avec des slashs donne le même
résultat :

use strict;
use File::Spec::Functions;
use Cwd;
my $cmd= 'C:/Program Files/Internet Explorer/iexplore.exe';
my $file = catfile(cwd(),'z.html');
my $ligne = $cmd." ".$file;
open SORTIE,""$ligne" |"; # 5 : NOK ?
while (<SORTIE>) {
#...
}
close SORTIE;

ne fonctionne pas davantage.


Eric
Erwan David
Le #23300741
Paul Gaborit
À (at) Thu, 21 Apr 2011 03:04:41 -0700 (PDT),
"Eric C."
Le seul point délicat à gérer concerne la présence d'espaces dans le
chemin d'accès à mon exécutable, et la consultation du fil http://bit.ly/fKvxLM
m'a permis de trouver des solutions pour gérer les arguments multiples
(la solution proposée par Paul Gaborit - syntaxe étendue d'open, avec
passage d'arguments en liste - n'est apparemment pas implémentée dans
mon perl 5.10)

Ci-dessous mes quelques tests, qui fonctionnent tous comme prévu sauf
le dernier :quelqu'un peut-il m'expliquer pourquoi l'appel n°5 redonne
le msg "'C:Program' n'est pas reconnu en tant que commande interne
bla bla ..." que les solutions 3 et 4 permettent de contourner ?



En tout premier lieu, N'UTILISEZ PAS DE BACKSLASH pour les chemins
Windows. Refaites *tous* vos tests en utilisant des chemins du type :

my $path = "C:/Progam Files/...";

Cela fait très longtemps que Windows accepte autant le "" que le "/"
comme séparateur.



Windows, pas trop même en XP certaines parties le refusent. Par contre
l'OS qui est en dessous de l'interface le fait depuis MS-DOS 3.1 (la
dernière version avant la convergence avec Unix, disait un certain
B. G. à l'époque).

Cela dit, je plussoie...

--
Le travail n'est pas une bonne chose. Si ça l'était,
les riches l'auraient accaparé
Paul Gaborit
Le #23301221
À (at) Thu, 21 Apr 2011 05:40:55 -0700 (PDT),
"Eric C."
... mais le même test effectué avec des slashs donne le même
résultat :

use strict;
use File::Spec::Functions;
use Cwd;
my $cmd= 'C:/Program Files/Internet Explorer/iexplore.exe';
my $file = catfile(cwd(),'z.html');
my $ligne = $cmd." ".$file;
open SORTIE,""$ligne" |"; # 5 : NOK ?
while (<SORTIE>) {
#...
}
close SORTIE;

ne fonctionne pas davantage.



Normal : vos " supplémentaires autour de $ligne casse tout. Elles ne
devraient apparaître qu'autour de $cmd. Et vous devriez en mettre aussi
autour de $file. Avec un truc comme ça :

my $ligne = qq{"$cmd" "$file"};
open SORTIE,"$ligne |"
or die "Can't exec '$ligne': $!n";

est-ce que ça marche mieux ?

Ceci étant, je ne suis pas sûr que iexplore.exe propduira beaucoup de
chose sur SORTIE...

--
Paul Gaborit - Perl en français -
Paul Gaborit
Le #23301211
À (at) Thu, 21 Apr 2011 15:09:35 +0200,
Erwan David
Paul Gaborit

Cela fait très longtemps que Windows accepte autant le "" que le "/"
comme séparateur.



Windows, pas trop même en XP certaines parties le refusent. Par contre
l'OS qui est en dessous de l'interface le fait depuis MS-DOS 3.1 (la
dernière version avant la convergence avec Unix, disait un certain
B. G. à l'époque).



J'ai toujours cru que Windows était un système d'exploitation avec une
interface graphique par dessus (explorer ?). On m'aurait menti ?
;-)

Cela dit, je plussoie...



On est d'accord.

--
Paul Gaborit - Perl en français -
Eric C.
Le #23302171
On 21 avr, 17:31, Paul Gaborit
À (at) Thu, 21 Apr 2011 05:40:55 -0700 (PDT),
"Eric C."


> ... mais le même test effectué avec des slashs donne le même
> résultat :

> use strict;
> use File::Spec::Functions;
> use Cwd;
> my $cmd= 'C:/Program Files/Internet Explorer/iexplore.exe';
> my $file = catfile(cwd(),'z.html');
> my $ligne = $cmd." ".$file;
> open SORTIE,""$ligne" |";                    # 5 : NOK ?
> while (<SORTIE>) {
>    #...
> }
> close SORTIE;

> ne fonctionne pas davantage.

Normal : vos " supplémentaires autour de $ligne casse tout. Elles ne
devraient apparaître qu'autour de $cmd. Et vous devriez en mettre aussi
autour de $file. Avec un truc comme ça :

  my $ligne = qq{"$cmd" "$file"};
  open SORTIE,"$ligne |"
   or die "Can't exec '$ligne': $!n";

est-ce que ça marche mieux ?



Ca fonctionne, en effet, merci


Ceci étant, je ne suis pas sûr que iexplore.exe propduira beaucoup de
chose sur SORTIE...



C'était à titre d'exemple :)
Le test peut ainsi être effectué par quiconque disposant d'un PC,
alors que la livraison de l'exe avec lequel je travaille effectivement
aurait été un peu plus contraignante :)

Eric
Publicité
Poster une réponse
Anonyme