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;
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. ;-)
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/>
Perl en français - <http://perl.mines-albi.fr/>
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. ;-)
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
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;
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;
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 <Paul.Gaborit@invalid.invalid> écrivait :
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é
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é
... 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...
... 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/>
Perl en français - <http://perl.mines-albi.fr/>
... 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...
À (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 ? ;-)
À (at) Thu, 21 Apr 2011 15:09:35 +0200,
Erwan David <erwan@rail.eu.org> écrivait (wrote):
Paul Gaborit <Paul.Gaborit@invalid.invalid> é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/>
Perl en français - <http://perl.mines-albi.fr/>
À (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 ? ;-)
> ... 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
On 21 avr, 17:31, Paul Gaborit <Paul.Gabo...@invalid.invalid> 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 :)
> ... 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 :)