Page 1 sur 1

[Ex] Un parseur de ligne de commande pour batch.

Posté : mer. 27 avr. 2011 17:55
par sksbir
Bonjour

Je suis en train de réaliser un parseur de ligne de commande pour réaliser des jobs autoit en batch. ( en anglais : line arguments parser )
L'idée, c'est d'aider à créer un batch qu'on appelle avec des options du style : toto.exe -B parm1 -C parm2 -x 1 -v 0 ( par exemple )

Parce que par défaut, quand on écrit toto.au3, le code pour analyser les arguments est à écrire de A à Z, et à recommencer quasiment à zéro pour le batch suivant si il a besoin d'autres paramètres...

Voici déjà ce que j'ai trouvé sur le net:
- http://www.autoitscript.com/forum/topic ... parameter/
- http://code.google.com/p/my-autoit/sour ... tParse.au3
- http://motersho.com/blog/index.php/2009 ... -approach/

Bref, du très compliqué et difficile à adapter à son usage personnel...
J'ai commencé à réfléchir à quelque chose qui ressemblerait à getopts, et je me suis dit que j'allais obtenir le même résultat que ce que j'avais déjà trouvé sur le net.

Je pars donc sur une approche vraiment nouvelle (à priori hein..) qui va consister à pêcher dans les arguments de la ligne de commande les seuls arguments qui m'intéressent et à ignorer les autres.

[edit: livraison version 0]
Exemple : Ce script est destiné à faire tourner un sql sous windows : il a besoin d'une base oracle (-B), d'un schéma (-S) et d'un password (-P)
Il accepte en option un mail (-m) et une option -v 1 ( mode verbose activé)
Il faut donc définir les 2 tableaux suivants:
Dim Const $LINEARGS_MANDATORY[3][2] = [["-S", "SCHEMA"],["-P", "SCHEMAPASS"],["-B", "BASEORACLE"]]
Dim Const $LINEARGS_OPTIONALS[2][3] = [["-M", "MAILRAPPORT", "test@test.org"],["-v", "VERBOSE", 0]]

Puis, du moment qu'on déclare que -S, c'est "SCHEMA", alors après l'analyse des arguments d'appel, on va retrouver la valeur dans $SCHEMA qu'il faut donc déclarer comme variable globale. On fait de même pour les variables qui récupèrent des valeurs.

Je conseille d'utiliser des variables qui soient "parlantes", car elles servent également à créer le message d'aide.
Exemple pour ici ,voici ce qu'on obtient si on lance le script avec l'option -h :
Syntaxe:-S SCHEMA -P SCHEMAPASS -B BASEORACLE [-M MAILRAPPORT] [-v VERBOSE]

Le tableau $LINEARGS_MANDATORY contient les arguments obligatoires, et est donc à 2 colonnes, ( flag, et variable affectée )
Le tableau $LINEARGS_OPTIONALS contient les arguments optionnels et est donc à 3 colonnes ( flag, variable affectée , valeur par défaut ).



Je pense qu'on peut transposer ce code bien plus facilement pour écrire d'autres batch que tous les codes de parseurs que j'ai pu voir jusqu'ici.

Voici le code ( certainement perfectible) :

► Afficher le texte

Re: [Ex] Un parseur de ligne de commande pour batch.

Posté : dim. 15 mai 2011 09:52
par pierrotm777
Votre sujet semble correspondre à l'un de mes besoin du moment :D .

Je souhaiterais pouvoir utiliser un script compilé ainsi :

Code : Tout sélectionner

script.exe|texte.txt
Comment puis-je adapter au plus simple votre script !

Merci par avance

Re: [Ex] Un parseur de ligne de commande pour batch.

Posté : dim. 15 mai 2011 19:39
par matwachich

Re: [Ex] Un parseur de ligne de commande pour batch.

Posté : mar. 17 mai 2011 08:53
par pierrotm777
Non, ce que je souhaite c'est faire un sorte que mon exe lise un attribut

Re: [Ex] Un parseur de ligne de commande pour batch.

Posté : mar. 17 mai 2011 10:55
par sksbir
pierrotm777 a écrit :Votre sujet semble correspondre à l'un de mes besoin du moment :D .
Je souhaiterais pouvoir utiliser un script compilé ainsi :

Code : Tout sélectionner

script.exe|texte.txt
Comment puis-je adapter au plus simple votre script !
Merci par avance
Bonjour
J'ai pas trop compris la question en fait ?
script.exe, c'est le script, et texte.txt, c'est quoi ?, et le | entre les 2, c'est quoi ?

Re: [Ex] Un parseur de ligne de commande pour batch.

Posté : mar. 17 mai 2011 12:26
par pierrotm777
texte.txt serait par exemple le fichier à traiter par script.exe , | étant le séparateur entre script.exe et texte.txt

Re: [Ex] Un parseur de ligne de commande pour batch.

Posté : mar. 17 mai 2011 13:51
par zeshrek
Pour info, quand on lance un script avec un parametre, on met juste un espace entre l'exe et l'argument...
Sinon, pour traiter les parametres, il y a le tableau $CmdLine.
$CmdLine[0] contient le nb d'arguments passés a l'exe
$CmdLine[1] à $CmdLine[n] contient les arguments, cad tout ce qui est entre 2 espaces. Donc tu parses ton tableau, tu identifie les parametres (gaffe aux majuscules/minuscules par ex) et tu traites selon ce que tu trouves.

Re: [Ex] Un parseur de ligne de commande pour batch.

Posté : mar. 17 mai 2011 15:34
par sksbir
Je confirme la réponse de zeshrek : pour un besoin aussi simple, il te suffit de tester CMDLINE

Le script que je propose en début de discussion est là pour faciliter l'écriture d'un script avec arguments multiples, et placés dans l'ordre qu'on veut ( à la sauce unix ).

Re: [Ex] Un parseur de ligne de commande pour batch.

Posté : mar. 17 mai 2011 19:19
par pierrotm777
Bon,
Alors je viens de tester la méthode cmdline .
Mon but étant juste que donner à mon script le nom d'un fichier à lire (.txt)
Pour l'instant j'appel un fichier exemple dans le script ainsi:

Code : Tout sélectionner

;définition du fichier .skin à lire
Dim $skinfile = @ScriptDir & "\GTA_MenuV.txt", $avArray, $var
_FileReadToArray($skinfile,$avArray)
$var = StringSplit($avArray[3],",")
$pngSrc = $var[3];définition du fichier .png
j'ai donc testé ceci:

Code : Tout sélectionner

Dim $skinfile , $avArray, $var
;lecture de l'attribut derriere l'exe
If $CmdLine[0] > 0 Then
    $skinfile = @ScriptDir & $CmdLine[1];initialisation du fichier .txt à lire
    _FileReadToArray($skinfile,$avArray)
    $var = StringSplit($avArray[3],",")
    $pngSrc = $var[3];définition du fichier .png
    MsgBox(0, "Info", "The skin file is :"&$skinfile&@crlf&"The png file is  :"&$pngSrc, 4)
Else
    MsgBox(0, "Info", "No skin file found--> exit", 4)
    Exit (0)
EndIf
J'ai créé un batch cmd.cmd avec lequel j'obtient une erreur:

Code : Tout sélectionner

overlaymenu.exe GTA_MenuV.skin
Si je remplace l'espace par un |, le fichier .skin s'ouvre dans notepad mais mon script de test me dis que le fichier n'est pas trouvé !

Re: [Ex] Un parseur de ligne de commande pour batch.

Posté : mar. 17 mai 2011 19:40
par pierrotm777
Bon, cela fonctionne bien avec un espace !
J'ai juste modifié le test !

Code : Tout sélectionner

Dim $skinfile , $avArray, $var
;lecture de l'attribut derriere l'exe
If $CmdLine[0] = 1 Then
    $skinfile = @ScriptDir&"\"&$CmdLine[1];initialisation du fichier .skin à lire
Else
    MsgBox(0, "Info", "No skin file found--> exit", 4)
    Exit (0)
EndIf

;MsgBox(0, "Info", "The skin file is :"&$skinfile)
_FileReadToArray($skinfile,$avArray)
$var = StringSplit($avArray[3],",");définition du fichier .png
$pngSrc = $var[3]
Avec un | à la place de l'espace ce serait possible ?

Re: [Ex] Un parseur de ligne de commande pour batch.

Posté : mar. 17 mai 2011 21:09
par zeshrek
pierrotm777 a écrit :Avec un | à la place de l'espace ce serait possible ?
En un mot : non

Bon, je développe.
Historiquement 7 descend d'XP qui lui meme descend de DOS qui lui même descend de qui lui même descend de CP/M80 qui lui même... j'arrete là, on est remonté a la fin des années 70 là.
Donc depuis CP/M80 (et meme avant) on lancait une application en lui passant un parametre en le séparant de l'exetutable par un espace (et en les séparant entre eux par des espaces si il y en avait plusieurs).
Les noms d'applications ne contenant pas d'espace, ca ne posait pas de pb, et c'était facile a lire pour les humains. Donc c'est resté.

Donc au point ou on en est, 2 solutions s'offrent a toi :
- tu fais comme tout le monde et tu utilises l'espace pour séparer tes parametres
- tu dévelopes ton propre OS, ou au moins ton propre shell, et a ce moment là tu pourras utiliser ce que tu veux comme séparateur, |, §, ou autre.

Perso, je te suggère la première solution ;)

Re: [Ex] Un parseur de ligne de commande pour batch.

Posté : mer. 18 mai 2011 11:09
par pierrotm777
Cette réponse me convient tout à fait.
Merci pour votre aide encore une fois.

Ps j'ai connais et travaillé sur CP/M 80 , que de souvenir ! :D