Soyez le premier à donner votre avis sur cette source.
Snippet vu 7 700 fois - Téléchargée 32 fois
'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
14 mai 2005 à 08:36
13 mai 2005 à 22:54
13 mai 2005 à 16:54
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
12 mai 2005 à 22:06
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
12 mai 2005 à 10:59
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.