Analyser une ligne de commande, simplement

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 051 fois - Téléchargée 30 fois

Contenu du snippet

Cette petite procédure permet d'analyser la ligne de commande de votre application ou tout autre chaine de caractères. Cela est très pratique quand le programme reçoit ces paramètres ainsi. Par exemple, votre programme est lancé avec la ligne de comande :
monprog.exe -a -b"un chemin complexe" -c:5 d
ma procédure va lors retourner un tableau de strings avec les valeurs suivantes:{
-a
-b"un chemin complexe"
-c:5
d
}donc vous n'avez tout simplement qu'à changer un paramètre pour que la procédure pour que les guillemets ne soient pas inclus et vous pouvez faire un split pour avoir paramètre:valeur.

Source / Exemple :


'Fait par DeadlyPredator le 11 mai 2005

'strCommandLine: chaine de caractères qu'il faut analyser
'aArgs: un tableau de strinsg (dim aArgs() as string)
'bKeepQuotes: si il faut conserver les guillemets
'bErase: si true, la procédure efface le tableau de strings que vous lui envoyé avant de l'utiliser

Sub ParseCommandLine(ByVal strCommandLine As String, ByRef aArgs() As String, Optional bKeepQuotes As Boolean = True, Optional bErase As Boolean = False)
On Error Resume Next
Dim i As Long, bInStr As Boolean, strCar As String, index As Long, strArg As String
If bErase Then Erase aArgs Else: index = UBound(aArgs) + 1: Err.Clear
For i = 1 To Len(strCommandLine)
strCar = Mid$(strCommandLine, i, 1)
    Select Case strCar
    Case """"
    bInStr = Not bInStr
        If bKeepQuotes Then strArg = strArg & """"
    Case " "
        If bInStr Then
        strArg = strArg & strCar
        Else
            If Not Trim$(strArg) = vbNullString Then
            ReDim Preserve aArgs(index)
            aArgs(index) = strArg
            index = index + 1
            End If
        strArg = vbNullString
        End If
    Case Else
    strArg = strArg & strCar
    End Select
Next
ReDim Preserve aArgs(index)
aArgs(index) = strArg
End Sub

Private Sub main()
Dim aParams() As String, strJob As String, i As Long
strJob = "-a -b""un chemin         complexe"" -c:5 d" 'strJob pourrait être remplacer par Command$ pour analyser la ligne de commande du programme
ParseCommandLine strJob, aParams, False, False
    For i = 0 To UBound(aParams)
    MsgBox (aParams(i))
    Next
End Sub

Conclusion :


Je ne crois pas qu'il y ait de bugs

A voir également

Ajouter un commentaire

Commentaires

Saros
Messages postés
921
Date d'inscription
vendredi 20 décembre 2002
Statut
Membre
Dernière intervention
23 septembre 2010

Des gens qui estiment que leur jugement se passe de commentaires
DeadlyPredator
Messages postés
222
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
30 juin 2008

Oups, j'avais mal comprit le sens du not, il inverse la valeur de la variable. Je vais ajuster ça et suprimer les call et let car ça fait du texte pour rien. J'ai choisit d'utiliser une chaine de caractère à la place du command$ car comme ça, le monde n'est pas oubligé de lancer le proc avec une ligne de commande (ou modifier l'option command line de vb). Si ça marche pour cette chaine de caractère là, ça va aussi marcher pour command$ ... et c qui les personnes qui donnent des 1/10?
Saros
Messages postés
921
Date d'inscription
vendredi 20 décembre 2002
Statut
Membre
Dernière intervention
23 septembre 2010

Mettre les Let et Call ça n'a aucun effet sur l'exécution du programme, si tu les met pas ils sont implicites et rajoutés par VB lors de la compilation de toute façon.

Et pour Not, j'ai pas trop compris ton explication :/ Il me semblait qu'éviter un If était plutôt à éviter....

Et sinon, tu pourrais donner l'exemple (dans Main) avec la chaine de commande passée au programme ? Pour montrer comment faire
DeadlyPredator
Messages postés
222
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
30 juin 2008

Salut

Je ne suis pas sûre que le fait de faire bInStr Not bInStr aide vraiment. Selon moi, vb ferait une opération de plus car en asm, avec un, c'est un simple mov qui est effectué. Avec ta méthode, vb va devoir inverser la valeur de bInStr, puis faire un mov ...

pour Let et Call, j'aimerais bien avoir l'avis d'un expert qui va pouvoir confirmer.

Pour l'idée de spliter, ça serait possible cependant, je crois que ça demanderait le double de traitement. Ma boucle est très simple et rapide. Split doit être lourd et de toute facon je vais devoir scanner le string au complet.

Merci pour l'intérêt porté à ce code
econs
Messages postés
4030
Date d'inscription
mardi 13 mai 2003
Statut
Modérateur
Dernière intervention
23 décembre 2008
19
---------------------------------------------
If bInStr Then
Let bInStr = False
Else
Let bInStr = True
End If

peut s'écrire plus simplement :

bInStr = Not bInStr

---------------------------------------------

Let et Call n'optimisent qu'une seule chose : la compatibilité avec d'anciennes versions de VB. L'execution du code n'y gagne rien

---------------------------------------------

En utilisant la fonction Split, une bonne partie du travail était déjà faite. Il ne restait plus qu'à recoller les morceaux qui sont entre guillemets. Mais je suppose que tu l'as soigneusement évitée.

aParams = Split(strJob, " ", , vbTextCompare)


---------------------------------------------

A part çà, le code est bien foutu. Pas de bug en vue. C'est nickel. :o)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.