Traitement paramètres en ligne de commande par RexExp

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: Traitement paramètres en ligne de commande par RexExp

#21

Message par Tlem »

Bonjour jpascal.
Merci pour ce code, mais il ne correspond pas à mes besoins.
Comme déjà indiqué, il y a au total 6 paramètres dont 5 facultatifs + un piège ALC ou parfois le NOM et le prénom sont dans le même paramètre (-N).

PS : Dans votre code il manque la fonction CmdLineHelpMsg() et quelques commentaires. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
rgx
Niveau 4
Niveau 4
Messages : 61
Enregistré le : sam. 16 nov. 2019 17:53
Status : Hors ligne

Re: Traitement paramètres en ligne de commande par RexExp

#22

Message par rgx »

Bonjour Tlem,

Pour l'instant, je trouve que c'est ma version (non-regex) qui donne le meilleur résultat.
(Mais bon, s'il faut absolument une regex, alors c'est à oublier)
; Full
$s = "PROG.EXE -P\\Serveur\D\Dossier -NLE N'ÔM-COMPOSË Le P'rénôm-Nordü -FJean-Pierre -B01011901 -D1234 -GM"

; Deux paramètres -P -N
; $s = "PROG.EXE -P\\Serveur\D\Dossier -NLE N'ÔM-COMPOSË Le Prénôm"
 
Local $aParams = StringSplit($s, " -", 1)
Local $mMap[10]

For $i = 2 To $aParams[0]

    $IdMap        = StringLeft    ($aParams[$i], 1)
    $mMap[$IdMap] = StringTrimLeft($aParams[$i], 1)
    ; If $IdMap = "N" Then ... (si plus d'une lettre à gauche est en majuscule => NOM Prénom)
    ConsoleWrite($IdMap & " - " & $mMap[$IdMap] & @CRLF)
Next
Ce qui donne la table suivante:
P - \\Serveur\D\Dossier
N - LE N'ÔM-COMPOSË Le P'rénôm-Nordü
F - Jean-Pierre
B - 01011901
D - 1234
G - M
Les caractères avec accents même bizarres passent.

L'intérêt de la table de hachage créée dynamiquement est que cela provoquera (je pense) une erreur si l'analyse tente de créer deux fois la même clé. C'est donc une vérification supplémentaire.

La seule chose qui peut bloquer c'est s'il y a un espace+tiret parasite dans le -N
Mais on peut alors ajouter un contrôle de cohérence après traitement.
- Il doit y avoir au maximum 6 paramètres (PNFBDG)
- -B est suivi de 8 chiffres
- -D est uniquement numérique
- -G est suivi de M ou F

En bonus à développer: Si -N alors isoler un possible NOM et prénom en testant si plus d'une majuscule au début du champ -N (et pas de -F)

:)
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

Re: Traitement paramètres en ligne de commande par RexExp

#23

Message par jpascal »

Tlem a écrit : mer. 11 déc. 2019 10:16 Bonjour jpascal.
Merci pour ce code, mais il ne correspond pas à mes besoins.
Comme déjà indiqué, il y a au total 6 paramètres dont 5 facultatifs + un piège ALC ou parfois le NOM et le prénom sont dans le même paramètre (-N).

PS : Dans votre code il manque la fonction CmdLineHelpMsg() et quelques commentaires. ;)
Désolé pour les commentaires. :oops:
Voici LES fonctions manquantes au cas où :
Func WriteLog($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 " & StringTrimRight(@ScriptName, 4) & @CRLF)
      Else
         ConsoleWriteError("Fin de " & StringTrimRight(@ScriptName, 4) & @CRLF)
      EndIf
      Exit 1
   EndIf
EndFunc   ;==>WriteLog

Func CmdLineHelpMsg($textesup = "")
   $texte = "Paramètre "
   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
   WriteLog(99, $texte)
EndFunc   ;==>CmdLineHelpMsg

Func CmdLineHelpMsg($textesup = "")
   $texte = "Paramètre "
   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
   WriteLog(99, $texte)
EndFunc   ;==>CmdLineHelpMsg

Pour la RegExp du nom/prénom, j'utiliserais ' ?([A-Z ]+) (.*)'
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2272
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: Traitement paramètres en ligne de commande par RexExp

#24

Message par jchd »

Question bête, mais pourquoi pas ?
Le logiciel métier en question n'accepte-t-il pas d'autre caractère pour spécifier le type de paramètre, comme /N au lieu de -N, ça faciliterait le travail ?
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: Traitement paramètres en ligne de commande par RexExp

#25

Message par Tlem »

Salut tout le monde.
J'ai pris le temps de faire différents tests avec plusieurs logiciels sensés envoyer les informations au logiciel PROG.EXE (de l'éditeur X).

Tout d'abord @JCHD :
Le caractère pour le type de paramètre ne peux pas être changé.

Ensuite, j'ai essayé différents logiciels qui envoient les paramètres à PROG.EXE et j'ai intercepté la ligne de commande pour voir comment chacun faisait.
Le premier est le logiciel métier de l'éditeur X (celui qui à créé PROG.EXE). Il envoie la ligne : PROG.EXE –P<Chemin> -N<NOM> <Prénom>
Le second est une sorte de passerelle qui capture les champs d'un logiciel métier d'une autre marque et envoie les infos à PROG.EXE. Malgré le fait de cibler Nom, Prénom, date de naissance et ID, il renvoie la ligne PROG.EXE –P<Chemin> -N<NOM> <Prénom>
Le troisième est un logiciel métier qui intègre le lien vers PROG.EXE. Il renvoie le ligne : PROG.EXE –P<Chemin> -N<NOM> <Prénom> <ID>
Le quatrième est un autre logiciel métier qui intègre le lien vers PROG.EXE.Il renvoie la ligne : PROG.EXE –P<Chemin> -N<Nom> <Prénom> N°Dossier XXXX:<ID> (XXXX = Nom du mode de fonctionnement)

Visiblement le mode commun PROG.EXE –P<Chemin> -N<NOM> <Prénom> <ID> semble être un ancien mode de transfert des données.
J'ai essayé de perturber PROG.EXE en créant des fiches avec des noms du genre "NOM -NPIEGE Prénom" ou "NOM -FPIEGE Prénom" mis cela ne le perturbe pas plus que ça.
J'ai réussit à le faire boguer avec "NOM -GM_PIEGE Prénom" dans lequel il s'arrète à " -GM" mais franchement, pour faire un nom avec -GM ou -GB il faut vraiment pas avoir de bol. ^^
D'après mes tests, on ne peux pas mettre de chiffres dans les zones NOM et Prénom, donc s'il y à -Bjj.mm.aaaa ou -Dxxx cela ne peux être que des paramètres.

Du coup :
  • Il y a toujours -P et -N.
  • Entre -P et -N, il y a toujours un chemin (sans espace entre -P et le début du chemin)
  • A première vue, s'il y a un prénom mais qu'il n'est pas envoyé sous la forme -F<Prenom> alors le prénom est mis à la suite du nom dans le paramètre -N
  • Le nom est toujours en majuscule.
  • Le prénom est toujours composé de la première lettre en majuscule et le reste en minuscule
  • Le numéro ID peut être derrière le nom + prénom ou derrière la balise -D et sera un nombre à 7 chiffres maxi.
  • La date de naissance ne pose pas de problème spécifique puisque le format est jjmmaaaa (nombre à 8 chiffres).
  • Le genre ne semble jamais utilisé dans l'ancien format et dans le nouveau ce sera -GM ou -GB ou -GO (Mâle, Femelle, Inconnu).
Il me faut donc récupérer le chemin qui ce trouve entre -P et -N (facile)
il me faut récupérer le nom qui est obligatoirement après -N. Obligatoirement en majuscule et qui s’arrête à l'espace qui précède une majuscule suivi d'une ou plusieurs minuscules, ou d'une majuscule suivit d'un caractère spécial, lui même suivit d'une ou plusieurs minuscules.
Ex :
NOM-COMPOSE L'e Prénom
NOM COMPOSE L-prénom
Enfin, il me faudra récupérer le N°ID qui sera un nombre après le paramètre -D ou le signe ":" ou un nombre en fin de chaine et précédé d'un espace.

Avec une telle complexité de récupération des informations, je ne vois qu'un ou plusieurs traitements spécifiques pour chacun des éléments à récupérer.
Voici déjà ce que je compte utiliser :

Code : Tout sélectionner

; Pour le chemin :
$aDatas = StringRegExp($sParams, "(*UCP)-P(.*?)\h+-N", 1)

; Date de naissance
$aDatas = StringRegExp($sParams, "\h+-?B?(\d{8})", 1)

; ID
$aDatas = StringRegExp($sParams, "\h+-?D?(\d{7})(?=\h+|$)", 1)

; Genre
$aDatas = StringRegExp($sParams, "\h-G([MBO])", 1)
Reste à traiter le NOM Prénom avec les contraintes déjà évoquées et éventuellement à améliorer les traitements ci-dessus. ;)
Je pense récupérer tout ce qu'il y à entre -N et -B ou -D ou -G ou un nombre ou une fin de chaine. Une fois le nom/prénom récupéré, on sépare les deux.
Ou alors, pour le nom, récupérer tout ce qui est en majuscule jusque la première minuscule puis supprimer tout ce qui est à droite jusqu'au premier espace trouvé et pour le prénom tout ce qu'il y a entre une majuscule suivie d'un apostrophe ou d'une minuscule, jusqu’au premier groupe " -" ou chiffre ou fin de ligne.

Merci d'avance pour l'aide apportée.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Répondre