moi po comprendre.... pb redirection comande DOS.... - Perl - Programmation
Marsh Posté le 08-08-2002 à 12:25:57
j'ai pas tout compris dans ton code, que cherche-tu exactement à récupérer ?
Marsh Posté le 08-08-2002 à 13:36:44
je cherche a recuperer le contenu d'un repertoire à travers la commande "dir"....
Marsh Posté le 08-08-2002 à 13:50:45
essaie ceci alors :
Code :
|
Par le biais de cette malheureuse ligne, tu récupères dans ton @_ ce que contient le répertoire courant (celui où le programme perl se trouve).
Attention, tu récupère aussi bien les fichiers que les répertoires !
Marsh Posté le 08-08-2002 à 13:55:36
la réponse que je viens de donner ne fait que récupérer les noms des fichiers ou de répertoires du répertoire que tu scannes
si tu veux réellement récupérer ce que fait un dir sous dos, tu peux utiliser ces 2 trucs ci-dessous :
Ou bien :
Code :
|
ça renverra ce que retourne le dir dans un fichier toto.log
Ou bien :
Code :
|
ici, c'est dans la variable $dir que tu récupère la totalité de ce que te renvoies le dir. L'apostrophe utilisée ` est celle obtenue avec AltGr + 7
Marsh Posté le 08-08-2002 à 14:07:22
le dernier code que tu ma donné ma l'air fort sympatique..
le prob c'est que ca donne le meme résultat que les autres..
au lieu de rediriger la commande vers la variable, il me l'affiche sur l'ecran (si je me souvien bien, celui-ci est la sortie standard)...
il y a pas possibilité de modifier la sortie standard.au lieu que ce soit l'ecran , on la change par une variable ??
Marsh Posté le 08-08-2002 à 14:13:20
thorra a écrit a écrit : le dernier code que tu ma donné ma l'air fort sympatique.. le prob c'est que ca donne le meme résultat que les autres.. au lieu de rediriger la commande vers la variable, il me l'affiche sur l'ecran (si je me souvien bien, celui-ci est la sortie standard)... il y a pas possibilité de modifier la sortie standard.au lieu que ce soit l'ecran , on la change par une variable ?? |
tu as essayé ce code là ?
Code :
|
et tu me dis que ça t'affiche le résultat du dir à l'écran ? Si oui, c normal, vire le print de mon code
Logiquement, le fait de faire $dir = `dir c:\temp` indique à perl de faire un appel à la commande dir de MsDos, et d'en rediriger la sortie standard (STDOUT pour Perl) dans la variable $dir. Il faut bien faire gaffe à utiliser l'anticote ` (altgr + 7) au lieu de ' (alt + 4)
sinon, vois si Perl ne t'indiquerai pas de message d'erreur au lancement du programme : ouvre une fenêtre MsDos et tape :
perl -c -w programme.pl
Marsh Posté le 08-08-2002 à 14:25:34
j 'ai bien utiliser l'anticote et virer le print... et pourtant STDOUT n'est pas redirigé.....
j 'ai essayer avec les paramètres -c et -w ,cela m'affiche ca :
name "main::dir" used only once : possible typo at programe.pl line 38.
programme.pl syntax ok
pourais tu m'expliker ce ke ve dire tout ca ??? please..
Marsh Posté le 08-08-2002 à 14:29:19
thorra a écrit a écrit : j 'ai bien utiliser l'anticote et virer le print... et pourtant STDOUT n'est pas redirigé..... j 'ai essayer avec les paramètres -c et -w ,cela m'affiche ca : name "main::dir" used only once : possible typo at programe.pl line 38. programme.pl syntax ok pourais tu m'expliker ce ke ve dire tout ca ??? please.. |
mmmm, le warning retourné par Perl ne me parle pas des masses
pourrais-tu STP balancer ton source ici STP ? Quelle est cette ligne 38 ? Et attention, c'est souvent que Perl t'indique une erreur à la ligne n, et que l'erreur se planque vicieusement dans la ligne n-1 ou encore + haut
désolé mais là, il me faudrait + d'éléments pour me pencher sur ton blème
Marsh Posté le 08-08-2002 à 14:37:32
voici mon code...
la plupart des lignes sont comentées... je fais pour l'instant des tests.. ;-)
#!c:\perl
use File::Spec;
use File::Copy;
use FileHandle;
#$fh=new FileHandle;
#$fh->open('dir /B c:\temp\ |','<';
#@lignes=$fh->getlines;
#$fh->close;
#print "nblignes=$#lignes\n";
#($volume,$dir,$fich) = File::Spec->splitpath( "c:\\temp\\" );
#$cmd="aze";
#print "$cmd\n";
#open (CMD, 'dir /B '.$volume.$dir.$fich.' |';
#open (Dir, 'dir /B c:\temp\*.txt |';
#@lignes=<COM>;
#print "ligne=$lignes\n";
#print "lignes=$#lignes\n";
#for($i=0;$i<$#lignes;$i++) {
#$ret = copy($volume.$dir.$fich,"c:\\ftp\\".$ligne);
#if($ret == 1){
# print "success2!!\n";
#}else{
# print "probleme2...\n";
#}
#}
#while ($ligne = <Dir> ) {
# chomp($ligne);
# print "ligne=$ligne";
#}
#close Dir;
$dir = `dir /B c:\\temp\\`;
Marsh Posté le 08-08-2002 à 14:42:31
je viens de tester toutes les lignes non commentées, le script fonctionne sous 2000
perl n'indique aucun warning à la compilation
je pense que ça doit être le /B dans ta commande dir, peut être que ME n'aime pas trop ça ?
Marsh Posté le 08-08-2002 à 14:43:23
voici ta portion de code testée et qui marche sous 2000 :
Code :
|
Marsh Posté le 08-08-2002 à 14:46:33
mais tu n'as pas répondu à la question suivante :
que veux-tu récupérer exactement ?
juste les noms de fichiers et/ou de répertoires ?
si oui, j'aurai un meilleur code pour celà ...
Marsh Posté le 08-08-2002 à 15:02:54
j'ai oublié 2 trucs :
le warning de Perl :
Code :
|
Perl te signale ici que tu as ouvert un handle (canal) Dir sans t'en servir dans le code. Et effectivement, tu fais pas de print, ni de scan du handle. C'est rien, ça.
Par contre, par convention les noms de handle en Perl s'écrivent toujours en majuscule. Donc, Dir devrait être DIR dans le code.
Marsh Posté le 08-08-2002 à 15:47:56
merci beaucoup pour ton aide..
en ce qui concerne la convention, j'ai utilisé du code que j'avais écris dan mes débuts.. dsl ;p
en ce qui concerne ce que je veux recuperer, je veux avoir la liste des fichiers et repertoire, le '/B' permet d'avoir le strict minimum pour l'affichage, juste le nom du fichier ou repertoire.. c'est un parametre de la comande DIR.
Marsh Posté le 08-08-2002 à 15:50:23
thorra a écrit a écrit : merci beaucoup pour ton aide.. en ce qui concerne la convention, j'ai utilisé du code que j'avais écris dan mes débuts.. dsl ;p en ce qui concerne ce que je veux recuperer, je veux avoir la liste des fichiers et repertoire, le '/B' permet d'avoir le strict minimum pour l'affichage, juste le nom du fichier ou repertoire.. c'est un parametre de la comande DIR. |
ok, donc autant passer par une globalisation de ton répertoire
et donc, le coup du @_ = <*> serait plus rapide qu'un appel à la commande dos dir
dans @_, tu récupères les noms (et rien que les noms) des fichiers et rép contenus dans le rép que tu globalise, et il te suffit de tester que chaque nom corresponde à un fichier pour isoler tes fichiers des rép
Marsh Posté le 08-08-2002 à 16:21:30
ok, ceci fonctionne pour le repertorie courant, mais si je veux utiliser un repertoire perso ?? comment fais-je ?
Marsh Posté le 08-08-2002 à 16:22:26
oups scuse.. je veux dire un repertoire autre que que le repertoire courant
Marsh Posté le 12-08-2002 à 09:30:49
tu avais fais comment pour sauvegarder un repertoire entier ( fichier + sous rep ) ?
Marsh Posté le 13-08-2002 à 13:55:58
thorra a écrit a écrit : tu avais fais comment pour sauvegarder un repertoire entier ( fichier + sous rep ) ? |
ben en fait, il faut que tu scannes l'intégralité du répertoire. Pour chaque élément que tu auras récupéré, il faut que tu testes s'il s'agit d'un répertoire ou d'un fichier.
Pour chaque répertoire trouvé, tu peux ensuite naviguer dans ce répertoire et refaire la procédure précédente (scan du répertoire).
En récupérant les chemins des répertoires, tu peux au final recréer l'arborescence du répertoire initial dans un autre répertoire, créer dedans les répertoires trouvés et y recopier tous les fichiers.
Marsh Posté le 25-09-2002 à 15:26:55
thorra a écrit a écrit : ok, ceci fonctionne pour le repertorie courant, mais si je veux utiliser un repertoire perso ?? comment fais-je ? |
les commandes equivalentes en perl sont opendir, readdir et closedir
un exemple :
Citation : |
Marsh Posté le 08-08-2002 à 10:17:04
j'ai comme code ceci:
open (COM, 'dir c:\\temp |';
@lignes=<COM>;
print "lignes=$#lignes\n";
close COM;
normalement il devrait mettre le résultat dans COM, mais..
il me l'affiche à l'ecran...
je suis sous WinME.... expliqué moi, moi je comprend pas....