Page 2 sur 3

Re: [..] Aide pour l'écriture d'un futur script.

Posté : mer. 16 juil. 2014 14:36
par blacksoul305
Bonjour,

je vais commenter les lignes que tu as mal comprises sur mon code, je laisserai overflow faire de même avec le sien. Mais il est essentiel que tu comprennes comment ces programmes fonctionnent pour que tu puisses réutiliser les les méthodes que l'on a utilisé. Cela dit je pars du principe que tu as compris le tutoriel sur OpenClassroom de Timmalos, je ne ferai donc pas de rappels sur les tableaux.

Les includes sont là quand on a besoin d'utiliser des fonctions qui ne sont pas directement incluses dans AutoIt. A la rigueur tu pourrais supprimer "#include <Array.au> car je ne l'ai utilisée que pour la phase de débuggage.

$mainMusicFoldersArray, le premier élément du tableau est le nombre de gros dossiers de musique que tu as décris, s'il y en a qu'un seul tu laisses le et tu modifies le chemin. S'il y'en a deux, il faut changer le format du tableau, le premier élément et rajouter le second chemin etc...

La première boucle For...Next parcours le premier tableau qui contient tes gros dossiers. On sait que le premier élément de n'importe quel tableau est au rang 0 soit $array[0]. Dans mon tableau, le rang 0 donne le nombre dossiers à parcourir. Et là tu devrais piger le truc. La variable $i donne l'index (le rang) du tableau. $i valant 1 au départ, et $mainMusicFoldersArray[0] valant 1 aussi, il y aura donc qu'un seul passage de boucle pour celle là. Logique tu n'as qu'un dossier de musique.

Telle que je l'ai appelée à cette ligne là de mon code, je demande à la fonction _FileListToArray de me renvoyer un tableau contenant le nombre de dossiers uniquement et leurs noms contenues dans la chemin $mainMusicFoldersArray[$i]. Maintenant tu sais d'après mes commentaires précédent ce qu'est finalement $mainMusicFolderArrays[$i]. Et ce tableau là correspond de la même manière au tableau des artistes contenus dans ton gros dossier.

On vérifie bien qu'il s'agisse d'un tableau pour vérifier qu'il y ait bien des dossiers, auquel cas le code ne peut pas continuer. La structure de tes dossiers n'est pas rigoureusement la même.

Encore une boucle For...Next, et celle là a la même objectif, parcourir chaque élément de tableau, sauf que là, c'est pour chaque nom d'artiste.

Le prochain _FileListToArray me permet de lister tous les dossiers toujours contenus dans le chemin $mainMusicFoldersArray[$i]\$artistNamesFoldersArray[$j]. Si tu as bien compris ce que j'ai dit, tu devrais comprendre ce que veut exactement dire cette ligne en fonction des valeurs de $i et de $j. Donc de lister le nom des albums.

Ma prochaine boucle For...Next permet maintenant de lister tous les fichiers de types wave contenus dans chaque albums. C'est ici aussi qu'on commence par initialiser la variable qui va nous permettre de donner le numéro de la chanson.

Une fois les musiques listées dans un tableau ($musicsArray), on renomme le fichier comme désiré. Le charabia comme tu dis, tu devais être en mesure de le comprendre si tu sais ce que peut donner les différentes variables du type : $array[$a], en fonction des valeurs de $i, $j, $k, $e. Le premier argument de FileMove est la source, facile. Le second et la destination des fichiers, on laisse le même chemin donc on se répète par contre la dernière partie (le nom du fichier) change, et on le renomme de la manière suivante : Artiste - Album - chanson - numéro .wav.

La fonction _GetMusicName($file) n'existe pas, c'est moi qui l'ai faite. Tu le vois car à la fin du script il y a Func _GetMusicName... EndFunc.
A quoi elle sert, en fait le problème est que $musicsArray[$e] me donne le nom d'une musique.wav. Or si je n'avais pas la fonction, le nom de tes musiques serait : Artiste - Album - musique.wav n.wav. En gros une extension se baladerait au milieu et c'est pas beau. Il fallait donc trouver un moyen de virer l'extension. La fonction _GetMusicName($file) renvoie le nom de $file mais sans l'extension.

Elle marche de la manière suivante. Je partage la chaîne de caractères en fonction d'un délimiteur : le point. On sait qu'une extension c'est fichier.ext. Ainsi, le dernier élément du tableau renvoyé par StringSplit est forcément l'extension du fichier. Par conséquent, je peux reconstruire le nom de la musique mais sans l'extension, en ajoutant peu à peu chaque élément de la musique sauf le dernier (l'extension), c'est pourquoi la boucle For...Next ne va pas jusqu'à $tempArray[0] le dernier index tu tableau puisqu'il s'agit de l'extension. La boucle va donc à $tempArray[0]-1.
La fonction retourne donc le nom de la musique sans l'extension. Par défaut, elle renvoie le même nom qui a été donné.

EDIT : Je te fais une sorte de résumé. En gros mon programme fait ça :

Code : Tout sélectionner

Pour chaque gros dossier de musiques, tu
    listes le nombre de dossiers (artistes) contenus dans le dossier de musique, dans un tableau
    si la liste est bien un tableau, alors
        Pour chaque artiste, tu
            listes le nombre de dossiers (albums) contenus dans le dossier de l'artiste, dans un tableau
            si la liste est bien un tableau, alors
                Pour chaque album, tu
                    mets le numéro de la musique à 1
                    listes le nombres de fichiers.wav (musiques) contenus dans le dossier de l'album, dans un tableau
                    si la liste est bien un tableau, alors
                        Pour chaque musique, tu
                            renommes le fichier (musique) de la manière suivante : artiste - album - nom de la musique sans extension numéro de la musique.wav
                            on rajoute 1 au numéro de la musique
                        FinPour
                    FinSi
                FinPour
            FinSi
        FinPour
    FinSi
FinPour
En espérant que les choses soient claires ! Bonne continuation !

Re: [..] Aide pour l'écriture d'un futur script.

Posté : mer. 16 juil. 2014 19:17
par MisterP
Tout devient clair à présent ! :mrgreen:
Mais j'ai quand même encore quelques questions :
-Ce qui me fait bizarre c'est que tu utilises rien pour renommer le fichier, FileMove , tu le déplace , le string est la pour virer l'extension mais a aucun moment tu n'utilises un Edit ... :shock:
Je devine également que le / remplace le - dans AutoIt pour l'écriture du nom de mon fichier wav ? ou il me faut rajouter mes tirets ? parce que je veux absolument mes tirets c'est le pied pour trier :P
Et si je souhaite mettre le numéro qu'occupe le morceau dans l'album avant le nom du morceau , j'ai donc juste à inverser les deux variables de place, non ?

-Et la chose qui m'est incompréhensible c'est : comment tu donnes des valeurs a tes variables sans connaitre cette valeur, enfin ce que je veux dire c'est comment tu peux donner la valeur à une variable sans avoir sélectionner cette valeur ou lu cette valeur ? Parce que tu n'as a aucun moment fait le "job" que ferait un Clic droit + Renommer + Sélection tout le nom du dossier/nom de la musique, de même comment sait-tu le numéro(position de la musique dans l'album), certes c'est le nombre de fichier mais pour les positionner comme sur le CD, il te faut l'ordre. C'est pourquoi, je viens de vérifier mais par chance le nom n'est enfaite pas Nomdelachanson.wav mais N° - Nomdelachanson.wav ce qui va beaucoup faciliter la tâche ! :D

-Je ne comprends également pas quel dossier cela va renommer ? Mon tout premier album dans mon tout premier dossier artistes de mon gros dossier ? Ou cela va me renommer absolument tout dans mon gros dossier, à savoir tous les dossiers artistes donc tous les albums et donc tous les morceaux ? (tous les .wav quoi)
Je tends a comprendre que cela renomme tout mais je ne suis pas sur.

-Pour finir, c'est juste une question concernant les Array, le tuto explique que c'est comme un tableau, sauf que nous on demandait une position (un numéro) entre [] pour avoir la valeur, mais la si j'ai bien compris a la place on utilise des variables ce qui signifierait que le tableau n'est en fait qu'une ligne :
$i(artiste) $j(album) $k(nomchanson) $e(numéro)
Donc si je met [1], cela me sort la variable i ??

PS : Le code en français que tu as rajouté m'aide vraiment beaucoup merci ! :) , ce code c'est bien une partie de ton code AutoIt, c'est ce que tu as appelé la fonction : _GetMusicName, on est ok ? :|



Encore merci pour toute votre attention :!: :!: :!:

Re: [..] Aide pour l'écriture d'un futur script.

Posté : mer. 16 juil. 2014 20:30
par orax
Si ça peut t'être utile : http://www.thefoolonthehill.net/drupal/ ... 20Debugger pour voir ce qui se passe, étape par étape, dans un script. Il n'est toutefois pas stable mais ça peut dépanner.
MisterP a écrit :Switch $nMsg
Jamais entendu parlé d'une fonction Switch :? , y'a pas dans la doc non plus ...
Dans le code, curseur sur le mot-clé/fonction/… → touche F1.

Re: [..] Aide pour l'écriture d'un futur script.

Posté : mer. 16 juil. 2014 20:43
par overflow
Je ne parlerais que pour ce qui concerne le code que j ai posté

Effectivement un oubli sur les numéros de chanson
Ca te feras un petit exercice ;) Aide : il n y a qu'une variable a rajouter au nom

Par contre en ce qui concerne tes commentaires en rouge je reste ..... consterné .....
TOUTES et je dit bien TOUTES les commandes sont expliquées dans le fichier d'aide

il serait bon pour toi de commencer a les regarder de très prés

je pourrais te dépanner sur un problème épineux ( mais la il n y en a pas ..... )
si tu n'y met pas du tient je ne peut rien de plus


ci-dessous tout les commentaires qui se résolvent en lisant la doc ;)
Jamais entendu parlé d'une fonction Switch :? , y'a pas dans la doc non plus ...
On modifie les données d'un contrôle , mais de quoi , dans quoi ? mistère
Si Racine a une valeur alors on fait un retour ???????
On remet la valeur de racine tout a droite de la chaine de caractère , SI ce n'était pas le cas, sinon on laisse comme c'était en donnant la valeur a cette variable, la valeur qu'elle possédait déjà (oulah ... ca doit pas être ça :| )
??? Les fonctions Array sont pas répertoriées dans la doc :S
Encore cette FileListToArray ????....
Mais après le message de Soul, il paraitrait logique que cette fonction ferait le job de $Array pour donner la valeur d'une ligne du tableau à la variable en question, donc ici Titre
Pourquoi on bougerai le fichier, alors que j'ai juste envie de le renommer ? :?

http://fr.openclassrooms.com/informatiq ... vec-autoit

Re: [..] Aide pour l'écriture d'un futur script.

Posté : mer. 16 juil. 2014 21:31
par MisterP
Merci pour le lien Orax ;) Cela me sera certainement très utile pour la suite !! :)

Overflow, pour les numéros, au final je n'ai rien a changer vu que il est compris dans le nom de la chanson (cf message plus haut, je pensais que j'avais juste [nomdechanson].wav Mais en fait j'ai [N° de chanson] - [nomdechanson].wav, ce qui signifie que au final mon numéro est directement intégré avec ma variable nomdechanson, si je ne me trompe pas ? :D
Sinon, je n'aurai eu qu'a rajouter une variable avec un compteur et ensuite insérer cette variable lorsque je renomme le fichier :)

Je n'utilisais pas F1 mais ça : http://www.autoitscript.fr/autoit3/docs/functions.htm
C'est pour ca que je risquais pas de trouver :oops: :oops: :oops:

N'existe t-il pas une aide en français ? je suis déjà un peu border line sur le vocab en francais , alors en anglais .... pour comprendre les fonctions :S
Encore une question débile a laquelle j'ai trouvé ma réponse ... :evil:
http://www.autoitscript.fr/forum/viewto ... ais#p83763

Je go essayer de regarder tout cela en anglais pour le moment, si jamais je ne comprends pas je reviens vous voir :P Sinon, et c'est ce que j'espère, je reviens vous voir avec mon script fini !!! :D :D :D

Re: [..] Aide pour l'écriture d'un futur script.

Posté : mer. 16 juil. 2014 21:34
par orax
Switch et For ne sont pas des fonctions donc tu ne pouvais pas les trouver sur la page des fonctions. Cependant ces instructions sont bien disponibles dans l'aide traduite, à http://www.autoitscript.fr/autoit3/docs/ puis dans « Instructions Conditionnelles ».

Re: [..] Aide pour l'écriture d'un futur script.

Posté : mer. 16 juil. 2014 23:50
par blacksoul305
Bonsoir,

je vais répondre à quelques unes de tes interrogations sur mon code.
-Ce qui me fait bizarre c'est que tu utilises rien pour renommer le fichier, FileMove , tu le déplace , le string est la pour virer l'extension mais a aucun moment tu n'utilises un Edit ...
FileMove(source,destination)
La source, ça va être le chemin complet soit : C:\User\Musique\Daft Punk\Human After All\Technologic.wav
Voilà, donc finalement le fichier c'est Technologic, AutoIt l'a identifié. Après la destination tu prends n'importe laquelle, et le nom du fichier, c'est le dernier "\", après ça tu mets le nom que tu veux, tant que l'extension y est. D'accord, FileRename serait plus appréciable, mais c'est logique avec FileMove quand on regarde. La destination du fichier dans mon code devient cette dernière :
C:\User\Musique\Daft Punk\Human After All\Daft Punk - Human After All - Technologic 1.wav si le fichier est le premier de la liste. C'est tout. Les "-" ne remplace pas les "\" car si je mets "\" il pense qu'il s'agit d'un autre dossier. Si tu créer un fichier texte, et que tu mets "\" dans le nom, Windows devrait te le refuser pour cette raison.
Et si je souhaite mettre le numéro qu'occupe le morceau dans l'album avant le nom du morceau , j'ai donc juste à inverser les deux variables de place, non ?
Oui, la ligne devient celle-ci :

Code : Tout sélectionner

FileMove($mainMusicFoldersArray[$i] & "\" & $artistsNamesFoldersArray[$j] & "\" & $albumsNamesFoldersArray[$k] & "\" & $musicsArray[$e],$mainMusicFoldersArray[$i] & "\" & $artistsNamesFoldersArray[$j] & "\" & $albumsNamesFoldersArray[$k] & "\" & $artistsNamesFoldersArray[$j] & "-" & $albumsNamesFoldersArray[$k] & "-" & $musicNumber & $musicsArray[$e])
De cette façon, logiquement _GetMusicName ne sert plus car tu peux laisser le nom de la musique et son extension, rien ne suit après c'est le dernier élément. Toujours veiller à l'extension, elle est obligatoirement en dernier de la chaîne.
-Et la chose qui m'est incompréhensible c'est : comment tu donnes des valeurs a tes variables sans connaitre cette valeur, enfin ce que je veux dire c'est comment tu peux donner la valeur à une variable sans avoir sélectionner cette valeur ou lu cette valeur ? Parce que tu n'as a aucun moment fait le "job" que ferait un Clic droit + Renommer + Sélection tout le nom du dossier/nom de la musique, de même comment sait-tu le numéro(position de la musique dans l'album), certes c'est le nombre de fichier mais pour les positionner comme sur le CD, il te faut l'ordre.
Tu m'as donné un schéma bien précis de cas de figure. Gros dossier (dossier)/Artiste(dossiers)/Album(dossiers)/Musique(fichiers). A partir de là je sais ce que je dois recenser et où il se trouve. Après tu dis que tes fichiers doivent être renommés ainsi, je sais comment on renomme des fichiers, je sais manier des tableaux, des fichiers, allons-y ! Toi même tu as tous les éléments pour réussir, jguinch t'a donné les fonctions relatives aux fichiers et t'as lu le tutoriel. Ce qu'il te manque c'est la pratique.
Ce qui t'empêche de comprendre nos codes ce sont les tableaux. Comment on sait ce qu'il représente. C'est simple, soit c'est nous qui les faisons, soit la fonction nous dit comment elle renvoie les informations.

$mainMusicFoldersArray[2] = [1,"C:\Users\User\Desktop\Musique"] << c'est un tableau que j'ai fait moi même, ainsi [0] > nombre de dossiers, [1] > chemin du dossier 1 etc...

$artistsNamesFoldersArray << c'est un tableau issue de la fonction, sauf que d'après elle, [0] nombre de dossiers (dans notre cas), [1] << nom du premier dossier etc...

$albumsNamesFoldersArray << pareil, la fonction ne change pas sauf, que ce sont des albums, pas des artistes.

$musicsArray << même fonction, mais pour des musiques cette fois-ci, alors on ne cherche que des fichiers, la réponse est un tableau de la même structure cela dit.

$musicNumber << une bête variable que incrémentes et réinitalises et que tu ajoutes.

Finalement toi même tu sais ce qu'elles valent après. Les variables $i, $j, $k, $e sont des variables qui te servent à parcourir ton tableau rapidement.
Prenons $i = 1, $j = 3, $k = 4, $e = 2

$mainMusicFoldersArray[$i] <=> $mainMusicFoldersArray[1] <=> chemin du premier gros dossier
$artistsNamesFoldersArray[$j] <=> $artistsNamesFoldersArray[3] <=> nom du troisième dossier (artiste) du gros dossier 1
$albumsNamesFoldersArray[$k] <=> $albumsNamesFoldersArray[4] <=> nom du quatrième dossier (album) de l'artiste 3 du gros dossier 1
$musicsArray[$e] <=> $musicsArray[2] <=> nom du second fichier avec extension (musique) de l'album 4 de l'artiste 3 du dossier 1.

De plus, si tu rajoutes les variables de cette façon là : $var1 & "\" & $var2... & "\" & $varn, tu obtiens le chemin. Donc source et destination comme tu le souhaites.
-Pour finir, c'est juste une question concernant les Array, le tuto explique que c'est comme un tableau, sauf que nous on demandait une position (un numéro) entre [] pour avoir la valeur, mais la si j'ai bien compris a la place on utilise des variables ce qui signifierait que le tableau n'est en fait qu'une ligne :
$i(artiste) $j(album) $k(nomchanson) $e(numéro)
Donc si je met [1], cela me sort la variable i ??
Un array, tu peux le voir comme un tableau en effet. Les arrays ont ce que l'on appelle plusieurs dimensions possibles, ici tu as plusieurs tableaux (arrays) à une seule dimension, c'est à dire que tu peux les considérer comme une ligne. Seulement, il y a dans mon code qu'un seul array permanent, qui est le même du début à la fin, il s'agit du premier. Car il n'est pas variable. En revanche, les artistes, et les albums musiques ont de fortes chances de ne pas être les mêmes.
Donc dire que ça : "$i(artiste) $j(album) $k(nomchanson) $e(numéro)" dans mon code c'est un tableau, c'est faux. Par contre tu pourrais en faire un. Néanmoins dans ton projet j'en vois pas trop l'utilité.
En ce qui concerne les $i, $j, $k et $e, tu devrais avoir compris dans mes explications précédentes de ce message.
PS : Le code en français que tu as rajouté m'aide vraiment beaucoup merci ! :) , ce code c'est bien une partie de ton code AutoIt, c'est ce que tu as appelé la fonction : _GetMusicName, on est ok ?
Euh... faux désolé. Le "français" sous forme algorithmique c'est ce que fait le programme, l'ordre des instructions, pour que tu vois comment tout se met en place. La fonction en revanche je te l'ai expliquée ici.
Elle marche de la manière suivante. Je partage la chaîne de caractères en fonction d'un délimiteur : le point. On sait qu'une extension c'est fichier.ext. Ainsi, le dernier élément du tableau renvoyé par StringSplit est forcément l'extension du fichier. Par conséquent, je peux reconstruire le nom de la musique mais sans l'extension, en ajoutant peu à peu chaque élément de la musique sauf le dernier (l'extension), c'est pourquoi la boucle For...Next ne va pas jusqu'à $tempArray[0] le dernier index tu tableau puisqu'il s'agit de l'extension. La boucle va donc à $tempArray[0]-1.
La fonction retourne donc le nom de la musique sans l'extension. Par défaut, elle renvoie le même nom qui a été donné.
Bonne soirée et bon courage !

Re: [..] Aide pour l'écriture d'un futur script.

Posté : jeu. 17 juil. 2014 00:22
par MisterP
D'accorrrrddddddd tout s'éclaircit !!!!!!!!! :D

Donc en fait on utilise FileMove car on peut dire que l'on ne renomme pas le fichiers mais que on le déplace et replace sous un autre nom.

Merci beaucoup pour l'explication des Arrays , des variables etc , je commence vraiment a comprendre, mon problème était que je voulais absolument rattacher les fonctions d'AutoIt à mon ancien programme ... Du coup je me plantais ...

Je commence a beaucoup mieux comprendre ! :D

Mon cerveau digère ça ce soir et demain matin et puis demain après-midi/soirée, je me lance dans l'écriture de mon Code, c'est un peu le but tout de même :)



Ah oui , juste pour l'histoire des - et des / , je parlais pas des / pour quand on recherche un fichiers dans l'explorateur, je parlais de quand tu renommais avec AutoIt , parce qu'en fait je tiens vraiment a avoir :
Artiste - Album - n° - nomchanson.wav
c c c
Je tiens vraiment aux tirets juste au dessus de mes c dans le nom de mes fichiers :)
Donc je suppose que j'ai juste à rajouter des tirets dans la fonction FileMove et tout sera parfait.



Mille merci !!!!!!

Re: [..] Aide pour l'écriture d'un futur script.

Posté : jeu. 17 juil. 2014 18:46
par mikell
MisterP a écrit : mon problème était que je voulais absolument rattacher les fonctions d'AutoIt à mon ancien programme ... Du coup je me plantais ...
Apparemment ton ancien programme fonctionne aux clics/touches - ce qui correspond en gros aux fonctions Control* d'AutoIt
Avec les codes précédents (joli tutoriel blacksoul ! :wink: ) la philosophie est complètement différente : les infos sont stockées en mémoire sous forme de variables, tableaux etc et exploitées ensuite dans le code par des fonctions Autoit en fonction du résultat souhaité

Pour aider à la compréhension des tableaux, je recommande vivement l'utilisation de _ArrayDisplay() -- on percute plus vite quand on visualise :mrgreen:

Code : Tout sélectionner

#include <File.au3>
#include <Array.au3>

Local $aFileList = _FileListToArray(@DesktopDir, "*", 1)
Dim $array[$aFileList[0]+1][2]
$array[0][0] = $aFileList[0]
$array[0][1] = "fichiers dans " & @DesktopDir
For $i = 1 to $aFileList[0]
   $array[$i][0] = $i
   $array[$i][1] = $aFileList[$i]
Next
_ArrayDisplay($array)

Re: [..] Aide pour l'écriture d'un futur script.

Posté : jeu. 17 juil. 2014 22:28
par MisterP
Merci Mikell ! Je ne connaissais pas cette fonction qui permet d'afficher le tableau, ça m'a vraiment aidé a mieux comprendre !
Et surtout encore une fois merci à BlackSoul pour toute son attention !!! ;)

Donc , voilà, ayant compris le code de Black et de Overflow après un certain moment, j'ai commencé à écrire mon code.
J'ai repris la GUI de Overflow à laquelle j'ai recoupé la fonction même pour renommer de Black qui me paraissait mieux a mon goût.
J'ai enlever la fonction compteur et numero de chanson vu que ce numéro est en fait finalement intégré dans mon nom de chanson.
Car mon nom exact est : N° - Nomchanson.wav comme expliqué précedemment ;)

Ce qui nous donne ça si je ne me suis pas trompé, si j'ai votre confirmation j'essai demain sur un dossier copie de ma WavDatabase ;)

SAUF QUE , évidemment ca ne marche pas ^^' ... Un problème avec la fonction _GetMusicName ($File) Si qqun peux m'expliquer ... Parce que normalement c'est censé marcher ...
► Afficher le texte

Re: [..] Aide pour l'écriture d'un futur script.

Posté : jeu. 17 juil. 2014 22:29
par jguinch
regarde du côté de _FileListToArrayRec pour lister les sous répertoires, ça te sera surement utile ^^

Re: [..] Aide pour l'écriture d'un futur script.

Posté : jeu. 17 juil. 2014 23:28
par blacksoul305
Bonsoir,

je ne compte pas cette fois te pondre des textes énormes car je suppose que tout est plus ou moins assimilés, si ce n'est pas le cas il te reste plus qu'à pratiquer et à essayer de comprendre par toi même :)

Néanmoins, je souhaiterai appuyer l'argument de mikell qui est le suivant : on comprend mieux en visualisant. C'est vrai, c'est pour ça que je te suggère d'essayer le code ci-dessous. Tu devrais beaucoup mieux comprendre pour le coup.

NB : Il ne faut pas oublier d'agrandir les fenêtres qui s'afficheront (pas les MsgBox mais les tableaux je veux dire) pour que tu puisses lire le titre, c'est important pour la compréhension. N'oublie pas non plus de modifier le chemin de $mainMusicFoldersArray et de pointer un dossier factice de musique. Du style, un gros dossier musique avec deux dossiers artistes, dans lesquels tu mets deux dossiers albums et dans lesquels tu finis par mettre deux fichiers textes.
► Afficher le texte
Ensuite, j'ai regardé très rapidement ton code, mais il semble qu'il n'arrive pas à se compiler. Il faut que tu fasses attention à plusieurs petites choses qui peuvent te bloquer.

- Attention à la syntaxe. Par exemple pour ton tableau, tu l'as déclaré de cette façon : Global $mainMusicFoldersArray[2] = $var, $artistsNamesFoldersArray, $albumsNamesFoldersArray.
Sauf que ce n'est pas bon, tu oublies les crochets. Ça doit faire ça : Global $mainMusicFoldersArray[2] = [$var, $artistsNamesFoldersArray, $albumsNamesFoldersArray]

- Attention à la portée de tes variables. ! Grossomodo :

Local -> la variable est accessible dans la portion de code où elle a été déclarée
Global -> elle est accessible dans le code entier

Dans ta fonction Dir() tu décides de mettre le chemin choisi dans une variable, très bien ! Sauf que ta variable $var est déclarée localement, et dans ta fonction. Du coup, Rename() ne peut pas y avoir accès, et par conséquent, AutoIt te crie dessus.

Ensuite la fonction Rename() ne marchera pas, car la façon dont tu déclares le tableau $mainMusicFoldersArray n'est pas logique avec la suite du code. Tu devrais chercher l'erreur par toi même.

Relis bien mon code, celui de overflow, et les conseils de tout le monde et pense à exécuter le second code que je t'ai fourni, tu devrais y avoir plus clair après ça !

Pour la maîtrise de l'abstraction des données et des tableaux, je te conseille de comprendre nos codes et de savoir les refaire, question rapidité, jguinch t'a donné une superbe fonction qui fait tout ce que tu demandes, ou en parti du moins.

Allé, bon courage et bonne soirée !

Re: [..] Aide pour l'écriture d'un futur script.

Posté : ven. 18 juil. 2014 00:41
par MisterP
Coucou ,
Alors j'ai cherché dans la doc, nada , j'ai cherché dans l'aide , nada , donc j'ai cherché sur internet pour FileListToArrayRec :
http://www.autoitscript.com/forum/topic ... ile/page-2
Donc j'ai rien compris à ce que les personnes disaient en anglais, j'ai pas trop de vocabulaire en anglais donc c'était plus ou moins ce à quoi je m'attendais, du coup, je regarde les lignes de script pour essayer de comprendre :)
$FileList = _FileListToArrayRec('C:\WINDOWS\system32', '*.exe', 1)
Func _FileListToArrayRec($sPath, $sMask = '*', $iFlag = 0)

Donc j'en déduis que c'est une fonction (Oaaaa trop fort ! ) et que ça met dans une ligne du tableau, un programme, ce qui permet donc d'affecter à une variable un programme (cf première ligne de code).


J'ai ensuite décidé d'aller tester ton Code pour avoir le tableau exact de ce que c'est censé faire.
Et la, surprise, vu ce que j'ai, il y a forcément un problème.
J'ai dans ma gui ce tableau :
[0] 1
[1] C:\Users\ ... (le chemin pour aller a mon dossier de musique quoi :)

C'est la que le visuel (d'ailleurs il est motherfucking génial ce visuel !!! :D en plus ça fait éxecuter ton script (qui marche) pas par pas et ça m'a vraiment fait bien tout comprendre !!! :) ) m'a fait rendre compte de quelque chose, pour s'amuser a mettre par exemple $ArtistesNameFoldesArray [0] ???
Parce que c'est un raccourcit qui n'en est pas un au final :
On pourrait à la place de [0] , on pourrai très bien mettre 1 directement ?
A moins que pour mettre 1 on soit obligé de respecter toutes les demandes à savoir des parenthèses , des guillemets etc.. ?

De plus tu mets des For [var] = 1 a tes variables $i $j $k alors qu'elles ne possèdent pas encore de valeur ???

A chaque fois que je pense avoir compris, je m'aperçois quelques heures plus tard que en fait, j'ai encore tout mal compris ... :? :? :?



Bon du coup, j'ai ensuite continué de rectifier mon code avec tes instructions en effet j'ai fait une erreur totalement débile avec Local/Global , surtout que ça je suis au point sur la partie théorique ...
Et sans les crochets , c'est sur que ca allait pas marcher ... ^^


Mon nouveau problème après ces quelques rectifications :
==> "Func" statement has no matching "EndFunc".:
Si je comprends bien il me dit que ma fonction n'est pas couplée avec une fin de fonction , or j'en ai une, j'ai donc l'impression qu'AutoIt ne digère pas le fait que j'ai mis une fonction dans une fonction ...
Je test vite fait sans la GUI et donc avec 1 seule fonction et vous tient au courant , pour le moment , mon script :
► Afficher le texte

Re: [..] Aide pour l'écriture d'un futur script.

Posté : ven. 18 juil. 2014 01:21
par orax
Woua, le pavé ! :lol: Vous allez nous écrire un roman tous les deux ! Image
MisterP a écrit :Alors j'ai cherché dans la doc, nada , j'ai cherché dans l'aide , nada , donc j'ai cherché sur internet pour FileListToArrayRec
Attention c'est _FileListToArrayRec sinon la recherche dans la doc (celle via F1) ne retourne pas de résultat. Ou écris *FileListToArrayRec éventuellement.
Cette fonction est bien présente dans la doc, à moins qu'elle n'y soit pas dans le pack FR mais j'en doute.

Les fonctions avec un _ comme préfixe sont généralement des fonctions créés par les utilisateurs (des UDFs). Ce ne sont pas des fonctions natives à AutoIt.

MisterP a écrit :De plus tu mets des For [var] = 1 a tes variables $i $j $k alors qu'elles ne possèdent pas encore de valeur ???
As-tu bien lu (et compris) la partie des boucles : http://fr.openclassrooms.com/informatiq ... i-tournent ? C'est expliqué.


Et aussi, ton code est mal indenté donc ce n'est pas étonnant que tu te perdes. Il y a un EndFunc tout en bas qui ne sert à rien. CTRT CTRL+T pour remettre ça en place.

Re: [..] Aide pour l'écriture d'un futur script.

Posté : ven. 18 juil. 2014 09:07
par blacksoul305
Bonjour,

MisterP, j'ai un simple exercice pour toi. Dis-moi ce que tu comprends de ce code là.

Code : Tout sélectionner

Global $mainMusicFoldersArray[3] = [2, "C:\Users\User\Desktop\Dossier de musique 1","C:\Users\User\Desktop\Dossier de musique 2"]

For $i = 1 To $mainMusicFoldersArray[0]
....
Next
Je veux que tu me dises tout ce que tu peux comprendre de ce code.

EDIT : à Orax -> t'as vu, je sais ne pas écrire des pavés des fois ! Haha !

Re: [..] Aide pour l'écriture d'un futur script.

Posté : ven. 18 juil. 2014 10:11
par MisterP
Attention c'est _FileListToArrayRec sinon la recherche dans la doc (celle via F1) ne retourne pas de résultat. Ou écris *FileListToArrayRec éventuellement.
Cette fonction est bien présente dans la doc, à moins qu'elle n'y soit pas dans le pack FR mais j'en doute.

Les fonctions avec un _ comme préfixe sont généralement des fonctions créés par les utilisateurs (des UDFs). Ce ne sont pas des fonctions natives à AutoIt.

--> Je viens de trouver effectivement, c'est le tout dernier onglet ! :)
_FileListToArrayRec Lists files and\or folders in specified path with optional recursion to defined level and result sorting
Et s'utilise donc de la manière suivante :
#include <File.au3>
_FileListToArrayRec ( $sFilePath [, $sMask = "*" [, $iReturn = $FLTAR_FILESFOLDERS [, $iRecur = $FLTAR_NORECUR [, $iSort = $FLTAR_NOSORT [, $iReturnPath = $FLTAR_RELPATH]]]]] )

Orax a écrit : As-tu bien lu (et compris) la partie des boucles : http://fr.openclassrooms.com/informatiq ... i-tournent ? C'est expliqué.
Oui, ça je l'ai appris mais ce que je ne comprends pas c'est que la variable n'a pas de valeur, on est OK ? (Tant que la fonction For n'est pas passée)
Ensuite il donne a sa variable, et c'est la que je comprends pas, une valeur qui va être de 1 jusqu'à $artistsNamesFoldersArray[0] (exemple) sauf que ,$artistsNamesFoldersArray[0] correspond à l'emplacement du dossier des artistes non ?? Or si AutoIt dit que la variable prends la valeur de 1 jusque cette variable, il devrait y avoir un problème vu que $artistsNamesFoldersArray[0] n'est pas un nombre mais plutôt un chemin.
Ou alors j'ai mal compris et $artistsNamesFoldersArray[0] = 1, mais dans ce cas, pourquoi ne pas dire $j 1 To 1 ($j = 1)
Orax a écrit : Et aussi, ton code est mal indenté donc ce n'est pas étonnant que tu te perdes. Il y a un EndFunc tout en bas qui ne sert à rien. CTRT+T pour remettre ça en place.
Ben non, j'ai 2 Func donc j'ai 2 End Func , à moins que ça ne marche pas comme ça ???
Je vais tester CTRL +T et vais modifier mon script ;)


BlackSoul :
Global $mainMusicFoldersArray[3] = [2, "C:\Users\User\Desktop\Dossier de musique 1","C:\Users\User\Desktop\Dossier de musique 2"]
--> On déclare une variable de type Global (donc en gros c'est à dire qu'on peux l'utiliser , l'appeler , s'en servir dans tous le script), cette variable c'est $mainMusicFoldersArray[3]. Et celle-ci est comprise dans un tableau de 3 lignes 1 colonne. Lorsque que l'on appelle, $mainMusicFoldersArray[1] la variable a la valeur 2,$mainMusicFoldersArray[2] c'est une variable qui a cette valeur : C:\Users\User\Desktop\Dossier de musique 1 et lorsqu'on appelle $mainMusicFoldersArray [3], la variable prends a pour valeur : C:\Users\User\Desktop\Dossier de musique 2.

For $i = 1 To $mainMusicFoldersArray[0]
--> La variable $i prends la valeur 1 jusqu'à $mainMusicFoldersArray[0]
Sauf que $mainMusicFoldersArray[0] je ne sais pas ce que c'est, la ligne 0 du tableau, on ne l'a pas remplie ....??
Cela veux dire que $mainMusicFoldersArray[0] = 0 ???
.....
Next
--> On fini la fonction For ... Next en finissant par le Next.




EDIT : Même en enlevant un EndFunc, le script ne marche pas et l'erreur qui apparaît est toujours la même...
(61) : ==> "Func" statement has no matching "EndFunc".:
Func _GetMusicName($file)

Et en enlevant une fonction, et donc sans GUI, on se retrouve avec un script presque identique à BlackSoul, non pas que je n'aime pas, mais je ne veux pas copier, même si j'ai réécris ses lignes de code moi-même, je ne veux pas avoir la copie même réécrite par mes soin du travail d'un autre :P

Script modifié avec les CTRL+T, et auquel j'ai enlevé un EndFunc :
► Afficher le texte

Re: [..] Aide pour l'écriture d'un futur script.

Posté : ven. 18 juil. 2014 11:53
par orax
2 fonctions donc 2 EndFunc, certes mais 1 des 2 EndFunc était mal placé. C'est pour cette raison que je t'ai dit de le supprimer. Mais il fallait le remettre… ailleurs ! :mrgreen:
C'est la boucle For qui n'était pas indenté par rapport à Rename().
Avec AutoIt, l'indentation n'a pas d'importance pour le bon fonctionnement du script, c'est juste pour aider la lecture de celui-ci.
Voir code + commentaire.
► Afficher le texte

Re: [..] Aide pour l'écriture d'un futur script.

Posté : ven. 18 juil. 2014 14:50
par MisterP
D'accord sauf que du coup, si je met un endfunc à cet endroit, alors il me faut remplacer dans Case bouton 1 le fait qu'il me faut appeler la fonction rename puis la fonction getmusicname.
Sinon je vais déclarer ma fonction rename et getmusicname mais le script n'executera que la fonction rename, non ?

Re: [..] Aide pour l'écriture d'un futur script.

Posté : ven. 18 juil. 2014 15:52
par orax
Eh ?
L'utilisateur clique sur le $Button1 ("Rename All !") → le script entre dans "Case $Button1" → Rename() → ligne 57, _GetMusicName() est exécutée avec l'argument $musicsArray[$e]
Donc dans la fonction Rename(), _GetMusicName() est bien exécutée.

CTRL+F5 pour vérifier qu'il n'y a pas d'erreur.

A

Posté : ven. 18 juil. 2014 17:53
par MisterP
On est d'accord que quand je marque par exemple :
Fun Rename ()
...
...
...
EndFunc

Je ne fais que définir une fonction, du coup le script ne fait rien, il assimile juste ce que fais une fonction sans l'utiliser.

Ce qui fait que "j'appelle" la fonction c'est : While 1 , Switch , Case $Button1, Rename ()
Ce qui signifie que lorsque j'appuie sur le bouton 1 (Rename All!) cela "appelle" ma fonction Rename.

Or si je met le EndFunc la ou tu me dis de le mettre, alors mon script sera de la forme :
Func Rename
EndFunc
Func GetMusic
EndFunc
Je définis donc les deux fonctions mais n'appelle que ma fonction rename parce que j'ai ces lignes de code :
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
Rename()
GetMusicName ($file)
Case $Button2
Dir()
EndSwitch
Or il me faudrait rajouter ce que j'ai mis en rouge pour que cela appelle la fonction Rename puis la GetMusic.

Quand tu dis "indentée" tu veux dire "comprise dans" ?

Bref, étant donné que je suis un rooky j'ai fait ce que tu m'as dis parce que j'ai encore du dire des bêtises ci dessus ^^...
Donc, maintenant j'ai une autre erreur qui apparaît :
Réponse : J'ai du déplacer cette ligne : $mainMusicFoldersArray[2] = [$var]
Dans la Func Dir ()
Parce que mon problème c'est que je lui donnait la valeur d'une variable qui n'avait pas de valeur ^^' Donc il suffisait de mettre cette ligne au bon endroit.
Donc voilà, apparemment là il n'y a plus d'erreur si ce n'est mon interrogation sur le fait que si j'appuie sur RenameALL (button1) , pour moi ça ne lance que la fonction Rename et donc pas Getmusicname et donc que le script ne va pas faire tout ce que je lui demande.
Je go tester sur un dossier factice ;)

Voici a quoi ressemble le script :
► Afficher le texte