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
Code : Tout sélectionner
Const $MONSCRIPT = StringTrimRight(@ScriptName, 4)
; ***************************** DEBUT SECTION CUSTOMISABLE **********************
$SCHEMA=""
$SCHEMAPASS=""
$BASEORACLE=""
$MAILRAPPORT=""
$VERBOSE=""
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]]
; ***************************** FIN SECTION CUSTOMISABLE **********************
Func ecrirelog($RC, $texte)
If $RC = 0 Or $RC = 99 Then
ConsoleWrite($texte & @CRLF)
Else
ConsoleWriteError($texte & @CRLF)
EndIf
If $RC <> 0 Then
If $RC = 99 Then
ConsoleWrite("Fin de " & $MONSCRIPT & @CRLF)
Else
ConsoleWriteError("Fin de " & $MONSCRIPT & @CRLF)
EndIf
Exit $RC
EndIf
EndFunc ;==>ecrirelog
Func cmdLineHelpMsg($textesup = "")
$texte = @ScriptName
If $textesup <> "" Then $texte &= ":" & $textesup & @CRLF
$texte &= "Syntaxe:"
For $CPT = 0 To UBound($LINEARGS_MANDATORY) - 1
$texte &= $LINEARGS_MANDATORY[$CPT][0] & " " & $LINEARGS_MANDATORY[$CPT][1] & " "
Next
For $CPT = 0 To UBound($LINEARGS_OPTIONALS) - 1
$texte &= "[" & $LINEARGS_OPTIONALS[$CPT][0] & " " & $LINEARGS_OPTIONALS[$CPT][1] & "] "
Next
ecrirelog(99, $texte)
EndFunc ;==>cmdLineHelpMsg
Func cmdLineparser()
If StringRegExp($CmdLineRaw, " -h | -help ") Then
cmdLineHelpMsg()
EndIf
For $CPT = 0 To UBound($LINEARGS_MANDATORY) - 1
$TEST = StringInStr($CmdLineRaw, " " & $LINEARGS_MANDATORY[$CPT][0] & " ")
If $TEST = 0 Then
cmdLineHelpMsg($LINEARGS_MANDATORY[$CPT][0] & " manquant.")
Else
For $CPT2 = 1 To $CMDLINE[0]
If $CMDLINE[$CPT2] = $LINEARGS_MANDATORY[$CPT][0] Then
If $CPT2 >= $CMDLINE[0] Then
cmdLineHelpMsg($LINEARGS_MANDATORY[$CPT][0] & ": argument Absent.")
Else
$VALEUR = $CMDLINE[$CPT2 + 1]
If StringLeft($VALEUR, 1) = "-" Then
cmdLineHelpMsg($LINEARGS_MANDATORY[$CPT][0] & ": argument incorrect:" & $VALEUR)
Else
$TEST = Assign($LINEARGS_MANDATORY[$CPT][1], $VALEUR, 2)
If $TEST = 0 Then
cmdLineHelpMsg($LINEARGS_MANDATORY[$CPT][0] & ": valeur ou variable incorrecte :" & $VALEUR)
EndIf
EndIf
EndIf
EndIf
Next
EndIf
Next
For $CPT = 0 To UBound($LINEARGS_OPTIONALS) - 1
$TEST = Assign($LINEARGS_OPTIONALS[$CPT][1], $LINEARGS_OPTIONALS[$CPT][2], 2)
If $TEST = 0 Then
cmdLineHelpMsg($LINEARGS_OPTIONALS[$CPT][0] & ": Valeur par défaut incorrecte :" & $LINEARGS_OPTIONALS[$CPT][2])
Else
For $CPT2 = 1 To $CMDLINE[0]
If $CMDLINE[$CPT2] = $LINEARGS_OPTIONALS[$CPT][0] Then
If $CPT2 >= $CMDLINE[0] Then
cmdLineHelpMsg($LINEARGS_OPTIONALS[$CPT][0] & ": argument Absent.")
Else
$VALEUR = $CMDLINE[$CPT2 + 1]
If StringLeft($VALEUR, 1) = "-" Then
cmdLineHelpMsg($LINEARGS_OPTIONALS[$CPT][0] & ": argument incorrect:" & $VALEUR)
Else
$TEST = Assign($LINEARGS_OPTIONALS[$CPT][1], $VALEUR, 2)
If $TEST = 0 Then
cmdLineHelpMsg($LINEARGS_OPTIONALS[$CPT][0] & ": valeur ou variable incorrecte :" & $VALEUR)
EndIf
EndIf
EndIf
EndIf
Next
EndIf
Next
EndFunc ;==>cmdLineparser
cmdLineparser()
MsgBox(0,"test","schéma:" & $SCHEMA & ",SCHEMAPASS=" & $SCHEMAPASS & ",baseoracle=" & $BASEORACLE & @CRLF & "mail:" & $MAILRAPPORT & ",verbose=" & $VERBOSE)
Exit