Hit-Parade .VB Research Center . Compteur
Accueil ~  Code ~  Programmes ~  Api ~  Forum ~  Cours ~  Livres ~  Quiz ~  Annuaire
~ Edito ~
12/03/2006 @ 13:39
Depuis la dernière mise à jour (qui remonte à... oulala plusieurs mois), un petit ménage de printemps s'impose. Ca tombe bien, c'est presque la période.
Au menu, et progressivement sur les jours à venir, rafraîchissement de plusieurs fonctions et procédures, nouvelles APIs et nouveaux programmes.

~ Rechercher ~

  

~ Annuaire VB ~
 Rechercher un site :
  

~ Partenaires ~

Classe : clsArgs
Classe pour la gestion des arguments de la ligne de commande.
(Consulté 27141 fois.)

Les applications VB acceptent des arguments sur la ligne de commande. Seulement, contrairement à une application en C, c'est à vous de gérer après le traitement de cette ligne. Compter le nombre d'argument, vérifier si un argument existe, récupérer sa valeur, ... tout cela peut être assez fastidieux. C'est pourquoi, j'ai mis au point une classe que j'utilise maintenant dans la plupart de mes applications. Elle permet de traiter simplement la gestion des arguments de la ligne de commande.

Son utilisation est simple. Suivant les cas, il faut déclarer un objet local ou global (Dim cArgs As New clsArgs). A partir de là on manipule les propriétés et méthodes de l'objet.

cArgs.Commande affiche la ligne de commande reçut par l'application, mais peut également recevoir une nouvelle ligne d'argument,
cArgs.CompteArgs retourne le nombre d'arguments de la ligne de commande,
cArgs.ExisteOption() permet de savoir si un argument existe,
cArgs.ValeurOption() retourne la valeur d'un argument.

Je n'ai pas mis en place de méthode d'énumération des arguments (je n'en ai pas l'utilité), je vous laisse le soin de la modification si cela vous parait nécéssaire.

Le caractère désignant un argument est défini en constante (CAR_ARGUMENT), par défaut, c'est "/".
La constante DIFF_MIN_MAJ permet d'indiquer si on fait la distinction entre les majuscules et minuscules, par défaut on ne la fait pas. C'est-à-dire que l'argument /F et /f sont considérés identiques.
Enfin, le délimiteur de chaîne par défaut (DELIMITE_CHAINE) est le guillemet. Cela permet dans notre cas de placer le caractère "/" dans une chaîne sans qu'il soit pris en compte en tant qu'argument.

Quelques exemples d'utilisation...

Avec ligne d'arguments : /fC:\Program Files\Test\Test.exe /e /a /i3 (équivalent à /fC:\Program Files\Test\Test.exe/e/a/i3 - sans espaces entre les arguments, le résultat est le même puisque l'espace n'est pas pris en compte comme séparateur d'argument).

cArgs.CompteArgs retourne 4,
cArgs.ValeurOption("f") retourne C:\Program Files\Test\Test.exe,
cArgs.ExisteOption("e") renvoie Vrai,
cArgs.ValeurOption("a") retourne une chaîne vide.

Pour conclure, le code parle de lui-même et reste assez logique. Les commentaires devraient vous aider à comprendre le déroulement des fonctions. Vous pouvez récupérer le code (fichier compressé), ou bien le consulter en direct ci-dessous.

' Chaque argument est déclaré par un "/" suivi d'une lettre
' désignant sa fonction. Si un "/" se trouve à l'intérieur de guillemets,
' il n'est pas pris en compte, on considère cela comme un chemin de fichier.
' Les espaces ne sont pas pris en compte comme séparateurs d'arguments,
' c'est à dire que /a/b/c équivaut bien à 3 paramètres.

Option Explicit
' Définit le délimiteur de chaîne (ici le guillemet)
' Permet de traiter /x="toto /a /b /c" /y comme 2 arguments seulement /x et /y
Private Const DELIMITE_CHAINE = """"
' Caractère de définition d'option
Private Const CAR_ARGUMENT = "/"
' Pas de distinctions entre majuscule et minuscule pour les arguments
Private Const DIFF_MAJ_MIN = False
' Ligne de commande
Private mst_Commande As String
' Nombre d'arguments sur la ligne de commande
Private mlg_Args As Long

Public Function
ValeurOption(stOption As String) As String
Dim
lgFor As Long, lgForIn As Long, lgLen As Long, lgCmd As Long
Dim
blTmp As Boolean
Dim
stTmp As String
' Vérifie si le caractère de définition d'argument est donné, si on le met
If Left$(stOption, 1) <> CAR_ARGUMENT Then stOption = CAR_ARGUMENT & stOption
stTmp = vbNullString
' Recherche si l'option existe sur la ligne de commande
If ExisteOption(stOption) Then
   
blTmp = False
   
lgLen = Len(stOption)
' Positionne le pointeur courant au départ de l'option
   
For lgFor = 1 To Len(mst_Commande) - lgLen
       
If (Mid$(mst_Commande, lgFor, 1) = DELIMITE_CHAINE) Then blTmp = Not blTmp
       
If Not blTmp Then
            If
DIFF_MAJ_MIN Then
                If
Mid$(mst_Commande, lgFor, lgLen) = stOption Then Exit For
            Else
                If
UCase$(Mid$(mst_Commande, lgFor, lgLen)) = UCase$(stOption) Then Exit For
            End If
        End If
    Next
lgFor
    lgCmd = Len(mst_Commande)
    blTmp =
False
   
lgFor = lgFor + lgLen
' Récupère la valeur associée à l'option choisie
   
Do While lgFor <= Len(mst_Commande)
' Permet de récupérer les chemins de fichiers entre guillemets
       
If (Mid$(mst_Commande, lgFor, 1) = DELIMITE_CHAINE) Then blTmp = Not blTmp
       
If Not blTmp Then
' Sort dès que l'option suivante est rencontrée
           
If (Mid$(mst_Commande, lgFor, 1) = "/") Then Exit Do
        End If
       
stTmp = stTmp & Mid$(mst_Commande, lgFor, 1)
        lgFor = lgFor + 1
   
Loop
   
stTmp = Trim$(stTmp)
' Suppression du guillemet au début et à la fin (seulement s'il y en a un au début)
   
If Left$(stTmp, 1) = DELIMITE_CHAINE Then stTmp = Mid$(stTmp, 2, Len(stTmp) - 2)
End If
ValeurOption = stTmp
End Function

Public Function
ExisteOption(stOption As String) As Boolean
Dim
lgFor As Long, lgLen As Long
Dim
blTmp As Boolean, blExiste As Boolean
' Vérifie si le caractère de définition d'argument est donné, si on le met
If Left$(stOption, 1) <> CAR_ARGUMENT Then stOption = CAR_ARGUMENT & stOption
lgLen = Len(stOption)
blTmp =
False
If
DIFF_MAJ_MIN Then
   
blExiste = (mst_Commande = stOption)
Else
   
blExiste = (UCase$(mst_Commande) = UCase$(stOption))
End If
For
lgFor = 1 To Len(mst_Commande) - lgLen
' Saute les guillemets qui peuvent encadrer un nom de fichier long contenant des espaces
   
If (Mid$(mst_Commande, lgFor, 1) = DELIMITE_CHAINE) Then blTmp = Not blTmp
   
If Not blTmp Then
       
' Gestion des majuscules/minuscules sur les arguments
       
If DIFF_MAJ_MIN Then
            If
Mid$(mst_Commande, lgFor, lgLen) = stOption Then
               
blExiste = True
                Exit For
            End If
        Else
            If
UCase$(Mid$(mst_Commande, lgFor, lgLen)) = UCase$(stOption) Then
               
blExiste = True
                Exit For
            End If
        End If
    End If
Next
lgFor
ExisteOption = blExiste
End Function

Public Function
CompteArgs() As Long
' Permet de compter le nombre d'arguments sur la ligne de commande
Dim lgFor As Long, lgLen As Long
Dim
blTmp As Boolean
' Regarde si on a déjà fait le travail ...
If mlg_Args < 0 Then
' ... sinon, on traite la ligne de commande.
   
blTmp = False
   
mlg_Args = 0
   
For lgFor = 1 To Len(mst_Commande)
   
' Saute les guillemets qui peuvent encadrer un nom de fichier long contenant des espaces
       
If (Mid$(mst_Commande, lgFor, 1) = DELIMITE_CHAINE) Then blTmp = Not blTmp
       
If Not blTmp Then
       
' Si on ne se trouve pas à l'intérieur de guillement, on incrémente le nombre d'argument
           
If Mid$(mst_Commande, lgFor, 1) = CAR_ARGUMENT Then mlg_Args = mlg_Args + 1
       
End If
    Next
lgFor
End If
CompteArgs = mlg_Args
End Function

Public Property Let
Commande(ByVal vData As String)
' Réaffecte la valeur de la ligne de commande
mst_Commande = vData
' Réinitialise le nombre d'argument
mlg_Args = -1
End Property

Public Property Get
Commande() As String
' Retourne la ligne de commande
Commande = mst_Commande
End Property

Private Sub
Class_Initialize()
' Récupération de la ligne de commande envoyée à l'application
mst_Commande = Command()
' Initialisation du nombre d'argument
mlg_Args = -1
End Sub
Visual Basic Research Center - (c) 2000/2002 -  Webmaster : docvb (chez) free (point) fr