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

Lancement de processus par open

6 réponses
Avatar
Eric C.
Bonjour =E0 tous,

Je cherche =E0 lancer des processus via "open+pipe", sur un poste
Windows.
Le seul point d=E9licat =E0 g=E9rer concerne la pr=E9sence d'espaces dans l=
e
chemin d'acc=E8s =E0 mon ex=E9cutable, et la consultation du fil http://bit=
.ly/fKvxLM
m'a permis de trouver des solutions pour g=E9rer les arguments multiples
(la solution propos=E9e par Paul Gaborit - syntaxe =E9tendue d'open, avec
passage d'arguments en liste - n'est apparemment pas impl=E9ment=E9e dans
mon perl 5.10)

Ci-dessous mes quelques tests, qui fonctionnent tous comme pr=E9vu sauf
le dernier :quelqu'un peut-il m'expliquer pourquoi l'appel n=B05 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=3D 'C:\Program Files\Internet Explorer\iexplore.exe';
my $file =3D 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 =3D $cmd." ".$file;
open SORTIE,"\"$ligne\" |"; # 5 : NOK ?
while (<SORTIE>) {
#...
}
close SORTIE;


Merci,

Eric

6 réponses

Avatar
Paul Gaborit
À (at) Thu, 21 Apr 2011 03:04:41 -0700 (PDT),
"Eric C." écrivait (wrote):

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 - <http://perso.mines-albi.fr/~gaborit/&gt;
Perl en français - <http://perl.mines-albi.fr/&gt;
Avatar
Eric C.
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
Avatar
Erwan David
Paul Gaborit écrivait :

À (at) Thu, 21 Apr 2011 03:04:41 -0700 (PDT),
"Eric C." écrivait (wrote):

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é
Avatar
Paul Gaborit
À (at) Thu, 21 Apr 2011 05:40:55 -0700 (PDT),
"Eric C." écrivait (wrote):

... 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 - <http://perso.mines-albi.fr/~gaborit/&gt;
Perl en français - <http://perl.mines-albi.fr/&gt;
Avatar
Paul Gaborit
À (at) Thu, 21 Apr 2011 15:09:35 +0200,
Erwan David écrivait (wrote):

Paul Gaborit écrivait :


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 - <http://perso.mines-albi.fr/~gaborit/&gt;
Perl en français - <http://perl.mines-albi.fr/&gt;
Avatar
Eric C.
On 21 avr, 17:31, Paul Gaborit wrote:
À (at) Thu, 21 Apr 2011 05:40:55 -0700 (PDT),
"Eric C." écrivait (wrote):



> ... 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