moi po comprendre.... pb redirection comande DOS....

moi po comprendre.... pb redirection comande DOS.... - Perl - Programmation

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

Reply

Marsh Posté le 08-08-2002 à 10:17:04   

Reply

Marsh Posté le 08-08-2002 à 12:25:57    

j'ai pas tout compris dans ton code, que cherche-tu exactement à récupérer ?


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

Marsh Posté le 08-08-2002 à 13:36:44    

je cherche a recuperer le contenu d'un repertoire à travers la commande "dir"....

Reply

Marsh Posté le 08-08-2002 à 13:50:45    

essaie ceci alors :
 

Code :
  1. @_ = <*>;


 
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 !


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

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 :
  1. system ("dir c:\temp >toto.log" );


ça renverra ce que retourne le dir dans un fichier toto.log
 
Ou bien :

Code :
  1. $dir = `dir c:\temp`;
  2. print $dir;


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


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

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

Reply

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 :
  1. $dir = `dir c:\temp`;
  2.   print $dir;


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 [:xtc]
 
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
 


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

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

Reply

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


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

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\\`;

Reply

Marsh Posté le 08-08-2002 à 14:37:32   

Reply

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 ?


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

Marsh Posté le 08-08-2002 à 14:43:23    

voici ta portion de code testée et qui marche sous 2000 :
 

Code :
  1. use File::Spec;
  2. use File::Copy;
  3. use FileHandle;
  4. $dir = `dir /B c:\\temp\\`;
  5. print $dir;


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

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


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

Marsh Posté le 08-08-2002 à 15:02:54    

j'ai oublié 2 trucs :
 
le warning de Perl :

Code :
  1. name "main::dir" used only once : possible typo at programe.pl line 38.


 
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.


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

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.

Reply

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


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

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 ?

Reply

Marsh Posté le 08-08-2002 à 16:22:26    

oups scuse.. je veux dire un repertoire autre que que le repertoire courant

Reply

Marsh Posté le 12-08-2002 à 09:30:49    

tu avais fais comment pour sauvegarder un repertoire entier ( fichier + sous rep ) ?

Reply

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.


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
Reply

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 :


  opendir(DIRHANDLE,"$rep_travail" )||die "ERROR: impossible de lire le répertoire courant\n";
  foreach (readdir(DIRHANDLE))
  {
    if ($_ =~ /\.dc/)
    {
       #print "Effacement de : ".$_."\n";
       unlink $_ ;      
    }
  }
  closedir DIRHANDLE;

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed