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

Partagez vos scripts, et vos applications AutoIt.
Règles du forum
.
Répondre
Avatar du membre
sksbir
Niveau 7
Niveau 7
Messages : 384
Enregistré le : lun. 26 oct. 2009 17:57
Localisation : Lyon
Status : Hors ligne

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

#1

Message 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
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

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

#2

Message 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
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

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

#3

Message par matwachich »

Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

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

#4

Message par pierrotm777 »

Non, ce que je souhaite c'est faire un sorte que mon exe lise un attribut
Avatar du membre
sksbir
Niveau 7
Niveau 7
Messages : 384
Enregistré le : lun. 26 oct. 2009 17:57
Localisation : Lyon
Status : Hors ligne

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

#5

Message 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 ?
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

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

#6

Message par pierrotm777 »

texte.txt serait par exemple le fichier à traiter par script.exe , | étant le séparateur entre script.exe et texte.txt
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

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

#7

Message 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.
Si vis pacem para bellum
Avatar du membre
sksbir
Niveau 7
Niveau 7
Messages : 384
Enregistré le : lun. 26 oct. 2009 17:57
Localisation : Lyon
Status : Hors ligne

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

#8

Message 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 ).
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

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

#9

Message 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é !
Fichiers joints
GTA_MenuV.txt
(2.84 Kio) Téléchargé 178 fois
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

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

#10

Message 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 ?
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

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

#11

Message 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 ;)
Si vis pacem para bellum
pierrotm777
Membre émérite
Membre émérite
Messages : 770
Enregistré le : sam. 11 oct. 2008 14:44
Localisation : Bordeaux
Status : Hors ligne

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

#12

Message 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
Répondre