Script qui liste un disque local

[Résolu]
Signaler
Messages postés
70
Date d'inscription
dimanche 18 décembre 2005
Statut
Membre
Dernière intervention
25 février 2007
-
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
-
Bonjour,
J'ai un script qui se présente comme ceci, il me sert a lister le contenu d'un répertoire dans un fichier txt. Seulement, tester le et vous verrez que qd je fais /list.a.dir , tout desuite une fenetre se lance pour me dire quel répertoire je veux lister. Je voudrais qu'il ne me demande pas quel repertoire je veux lister, mais que par défaut, il list le e:\ avec un depth 1, ainsi, qu'il liste que les dossier a la racine de ce lecteur local et qu'il enregistre aussi le txt automatiquement dans le c:\list.txt et qu'il ne me demande pas quel nom je veux donner a ce txt. Merci de m'éclaircir les idées la dessus, je ne sais pas trop ce qu'il faut changer, et j'avoue que j'nai pas trop envie de m'aventurer la dedans, et de tout faire foirer. Merci d'avance, je ne pense pas que ca soit si difficile. Merci d'avance.
Bien cordialement
Bonne soirée

alias list.a.dir {
  var %file = $file="Save List As..." C:\list.txt
  %file = " $+ %file $+ "
  write -c %file
  var %dir = $sdir="Select directory to list. Click cancel when no more dir to add."
  %dir = " $+ %dir $+ "
  %depth = 0
  while ( %depth != 1 && %depth != 2 ) { %depth = $$?="Enter the depth of search(1 or 2). Note that only the folders to the specified depth will be listed." }
  while ( %dir != $null ) {
    if ( %depth == 1 ) { echo 4 Number of Folders Listed: $finddir(%dir,*,0,%depth,write %file $nopath($1-)) }
    else { echo 4 Number of Folders Listed: $finddir(%dir,*,0,1, echo 4 $finddir($1-,*,0,1, write %file $nopath($longfn($1)) ).shortfn ).shortfn }    
    %dir = $sdir="Select directory to list. Click cancel when no more dir to add."
    %dir = " $+ %dir $+ "
    %depth = 0
    while ( %depth != 1 && %depth != 2 ) { %depth = $$?="Enter the depth of search(1 or 2). Note that only the folders to the specified depth will be listed." }
  }
}

42 réponses

Messages postés
840
Date d'inscription
vendredi 28 janvier 2005
Statut
Membre
Dernière intervention
25 février 2009
1
/help $findfile
Messages postés
70
Date d'inscription
dimanche 18 décembre 2005
Statut
Membre
Dernière intervention
25 février 2007

Bonsoir,
Je ne vois pas trop comment utiliser cette commande. ELle s'y trouve deja en plus.

Je viens de modifier quelques petites choses. Enfin surtout supprimer des lignes. Je me retrouve avec ceci, quasiement ce que j'aimeris avoir, ca ne me demande plus quel répertoire lister, par defaut c'est e:\ et ca ne me demande plus quel depth egalement puisque je l'ai mis a 1. Mais la gros probleme, ca ne s'arrete pas, ca ne cesse de lister, lister, lister .... ou ets le probleme ? quelqu'un peut m'expliquer ?

alias list.a.dir {
  var %file = C:\list.txt
  %file = " $+ %file $+ "
  write -c %file
  %dir = " e:\ $+ "
  %depth = 1
  while ( %dir != $null ) {
    if ( %depth == 1 ) { echo 4 Number of Folders Listed: $finddir(%dir,*,0,%depth,write %file $nopath($1-)) }
 ).shortfn ).shortfn }   
  }
}

Merci d'avance, bien cordialement. Bonne nuit.
Messages postés
840
Date d'inscription
vendredi 28 janvier 2005
Statut
Membre
Dernière intervention
25 février 2009
1
Ce qu'il faut savoir, c'est qu'un $findfile effectue une boucle.
De plus ta boucle while ( %dir != $null ) { est fausse car comme ta variable dir ne changera jamais pendant l'execution de la boucle, celle-ci devient infinie.
ton code devient (simplifié)

alias list.a.dir noop $findfile(e:\,*.*,0,1,write list.txt $1-)
Messages postés
70
Date d'inscription
dimanche 18 décembre 2005
Statut
Membre
Dernière intervention
25 février 2007

Bonjour,

Ah d'accord, meme tres simplifié. Je pensais pas qu'il aurait pu etre autant réduit. Merci pour ton aide fjxokt, bonne journée

Bien cordialement.
Messages postés
70
Date d'inscription
dimanche 18 décembre 2005
Statut
Membre
Dernière intervention
25 février 2007

Re bonjour,

Maintenant j'aurais voulu améliorer mon code, et faire en sorte qu'une fois cette liste crée, au bout de 5s, copier la ligne 1 du txt dans var %line et echo @Test %line . Pour copier la ligne 1, comment faire ?


Merci d'avance.
Messages postés
840
Date d'inscription
vendredi 28 janvier 2005
Statut
Membre
Dernière intervention
25 février 2009
1
alias list.a.dir {
    noop $findfile(e:\,*.*,0,1,write list.txt $1-)
    timer 1 5 copy.line
}

alias copy.line {
    var %line $read(list.txt,1)
    echo @test %line
}

Bon par contre creer une variable n'est pas utile, tu peux directement faire un echo avec $read.
Messages postés
70
Date d'inscription
dimanche 18 décembre 2005
Statut
Membre
Dernière intervention
25 février 2007

Bonsoir,

Je viens de tester a l'instant le morceau de code en rentrant, et je me rend compte qu'il y a un probleme.



alias list.a.dir {
    noop $findfile(e:\,*.*,0,1,write list.txt $1-)
    timer 1 5 copy.line
} <- ceci ne crée pas de list.txt, je ne sais pas trop d'ou vient le pb.

J'ai l'impression qu'il y a un pb, merci d'avance de me dire si chez vous ca fonctionne bien
Bien cordialement.
Bonne soirée
Messages postés
840
Date d'inscription
vendredi 28 janvier 2005
Statut
Membre
Dernière intervention
25 février 2009
1
J'ai essayé le code (avec c:\ car je n'ai pas de e:\) et ça fonctionne correctement.
Si ton fichier n'est pas crée, c'est que le findfile ne trouve rien.
Messages postés
70
Date d'inscription
dimanche 18 décembre 2005
Statut
Membre
Dernière intervention
25 février 2007

Bonsoir,

Je viens de comprendre pourquoi, en fait, la cette partie de code, ne liste que les fichiers et pas les dossiers. Comme je n'ai pas de fichier seul a la base de mon e:\, il n'y a rien normal. En fait, j'aimerais qu'il fasse l'inverse, qu'il ne liste que les dossiers et non les fichiers. Je viens de tester $finddir mais ca ne marche pas. Est ce l'identifieur qui convient ?

Merci d'avance.
Messages postés
840
Date d'inscription
vendredi 28 janvier 2005
Statut
Membre
Dernière intervention
25 février 2009
1
oui c'est le bon ;-)

alias fdir noop $finddir(e:\,*.*,0,1,write list.txt $1-)
Messages postés
70
Date d'inscription
dimanche 18 décembre 2005
Statut
Membre
Dernière intervention
25 février 2007

Bonsoir,
Merci fjxokt, enfin ca marche :) Je sais, ca doit vous apraitre simple, mais je suis débutant ;)
Euh, je viens de faire une petite modif

alias fdir noop $finddir(e:\,*.*,0,1,write list.txt $right($1-,-3)) <- n'y a t'il pas un autre moyen que $right($1-,-3) pour enlever le e:\au début de chaque ligne dans le list.txt ?

Merci d'avance :)
Messages postés
840
Date d'inscription
vendredi 28 janvier 2005
Statut
Membre
Dernière intervention
25 février 2009
1
c'est le meilleur moyen :-)
Messages postés
70
Date d'inscription
dimanche 18 décembre 2005
Statut
Membre
Dernière intervention
25 février 2007

Bonjour,
D'accord, si c'est la meilleure solution, laissons comme ceci.
Donc pour l'instant, tout marche comme je le désire, le script, liste bien tous les dossiers du disque local e:\ , les inscrit dans un fichier list.txt, copie la premiere ligne du txt et echo dans la fenetre @Test .
Le script se présente de cette façon :

alias list.a.dir {
    noop $finddir(e:\,*.*,0,1,write list.txt $right($1-,-3))
    timer 1 5 copy.line
}

alias copy.line {
    var %line $read(list.txt,1)
    echo @test %line
}

Mais je voudrais modifier quelques petites choses, au lieu de echo @Test %line, je veux

/say #channel !verify %line
Et ensuite, si le bot " Nutella says : " %line allowed " then echo @Test %line is allowed .
Mais je ne sais pas trop comment présenter la ligne if Nutella ...

Merci de bien vouloir m'éclaircir les idées, bien cordialement.

Bonne journée

 
Messages postés
840
Date d'inscription
vendredi 28 janvier 2005
Statut
Membre
Dernière intervention
25 février 2009
1
tu dois, puisque c'est un bot qui te dit si ta ligne est "allowed", te servir de l'event on text.
Par contre il faudra plutot stocker le %liune dans une variable globale.

alias list.a.dir {
    noop $finddir(e:\,*.*,0,1,write list.txt $right($1-,-3))
    timer 1 5 copy.line
}

alias copy.line {
    set %line $read(list.txt,1)
    say $active !verify %line
}
on *:text:*:*:if (($nick Nutella) && ($1- %line allowed)) { echo @test %line is allowed | unset %line }
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
1
A quoi sert le timer ? et rajoute un $strip sur le on text
Messages postés
70
Date d'inscription
dimanche 18 décembre 2005
Statut
Membre
Dernière intervention
25 février 2007

Bonjour, voici comment se présente monde code.

alias fdir {
  remove list.txt | echo $active 1 - list.txt got deleted
  noop $finddir(f:\,*.*,0,1,write list.txt $right($1-,-3))
  timer 1 1 copy.line
}

alias copy.line {
  var %line $read(list.txt,1)
  /msg #channel !test %line
}

on *:TEXT:*:#channel:{

  if ( $nick == Nutella ) {

    if ( allowed isin $2 )  {

echo $active %line " je fais ce test d'echo pour voir
si %line est pris en compte, mais je me rend compte que ca n'echo rien
a chaque fois, comme si %line est vide :x "


    /var %dossier $strip($1, burc)

    if ( %line == %dossier ) {

      echo @Test %line is good

    }

  }

}

A chaque fois ca me dis que %line is good, meme si ca ne l'est pas, merci de me dire ce qui est bon. Bien cordialement.
Messages postés
840
Date d'inscription
vendredi 28 janvier 2005
Statut
Membre
Dernière intervention
25 février 2009
1
dans ton alias copy.line tu dois setter ta var sinon elle sera locale
set %line $read(list.txt)

et ici utilise strip

on *:TEXT:*:#channel:{
  if ( $nick == Nutella ) {
tokenize 32 $strip($1-)
...
Messages postés
70
Date d'inscription
dimanche 18 décembre 2005
Statut
Membre
Dernière intervention
25 février 2007

Bonsoir,
Merci, ca marche deja mieux avec le set %line au lieu de var %line ;-)
Néanmoins, je ne comprends pas a quoi sert, tokenize, et faut t'il le mettre a la place    /var %dossier $strip($1, burc) ?
Je ne comprends pas trop a quoi ca sert, ou le placer et le résultat que ca donne.

Je voudrais encore améliorer mon script. Ca a vérifier pour la ligne 1 du txt, maintenant il faudrait faire ligne 2, ligne 3 ... etc jusqu'a la fin. Je ne sais pas trop si c'est techniquement faisable. Merci de me dire si c jouable ou pas.

Bonne soirée, merci
Messages postés
2466
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
1 août 2010
1
Le tokenize sert a remplir les parametres $* :
/tokenize 32 1 2 3ici, $1 1, $2 2 et $3 = 3 et 32 est utilisé pour separé les different $* par un espace
Pour lire tout le fichier il suffit de faire une boucle mais pour ne pas excess flood tu devrais faire comme ca :

alias fdir {
  remove list.txt | echo $active 1 - list.txt got deleted
  noop $finddir(f:\,*.*,0,1,write list.txt !test $right($1-,-3))
  .timer 1 1 play # list.txt
}

on *:TEXT:*:#:{
tokenize 32 $strip($1-)if ($nick Nutella && $2 allowed) echo @Test $1 is good
}

J'ai changé quelque trucs en pensant que c'est bon mais a toi de me dire :)
Messages postés
70
Date d'inscription
dimanche 18 décembre 2005
Statut
Membre
Dernière intervention
25 février 2007

Bonjour,
Tout d'abord, merci wims et fjxokt pour votre aide. wims, ton code est nikel, ca play bien sur le channel que je veux. Enfin, j'ai configuré cette ligne comme je le souhaitais en spécifiant le bon channel :   .timer 1 1 play # list.txt
Ca marche nikel.Un truc que je voudrais faire, c'est que si $1 une ligne qui est dans channel.txt, seulement si et non pas si ==. je veux bien spéficier que les majuscules soit respectés, alors delete cette ligne dans le list.txt . J'avais fais quelque chose comme ceci,   
   if ( %line === %dossier ) { mais dans votre code, vous n'utilisez plus %line
Comment faire ceci ?

Merci d'avance.