DÉCOMPOSER LES ARGUMENTS D'UNE LIGNE DE COMMANDE (GÈRE LES GUILLEMETS)

Signaler
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
-
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/39435-decomposer-les-arguments-d-une-ligne-de-commande-gere-les-guillemets

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
sans vouloir relancer la polémique...

voici un code fonctionnel (on m'a demandé ce code, je voulais filer une version claire...)


Private Sub Form_Load()
Dim i As Long
Dim xsParts() As String
xsParts = ParseCommandLine("")
For i = LBound(xsParts) To UBound(xsParts)
Debug.Print i, xsParts(i)
Next i
Unload Me
End Sub

Private Function ParseCommandLine(Optional ByVal vsCommandLine) As String()
Dim i As Long
Dim bInQuotes As Boolean
Dim nChar As Integer
'# Si aucune chaine avec les arguments de ligne de commande n'a été fournie...
If IsMissing(vsCommandLine) Then
'# On utilise celle recue par l'executable, obtenu grâce a la fonction Command$()
vsCommandLine = Trim$(Command$())
Else
'# sinon, on utilise celle effectivement fournie par l'utilisateur.
vsCommandLine = Trim$(vsCommandLine)
End If
If LenB(vsCommandLine) Then
'# On regarde la chaine, caractère par caractère
For i = 1 To Len(vsCommandLine)
'# On évite d'extraire deux fois le même caractère
nChar = AscW(Mid$(vsCommandLine, i, 1))
'# Si le caractère considéré est une guillemet, on incrémente le compteur
If nChar = 34 Then
bInQuotes = Not bInQuotes
'# si c'est un espace...
ElseIf nChar = 32 Then
'# ...et que nous sommes en dehors d'un 'tronçon' avec des guillemets,
'# on remplace l'espace par un carctère \0
If Not bInQuotes Then
Mid$(vsCommandLine, i, 1) = vbNullChar
End If
End If
Next i

'# tout tronçon de chaîne ouvert par des " doit être fermé
'# On teste donc si le nombre de guillemets est pair ou impair
If bInQuotes Then
Err.Raise vbString, , "Construction de la chaîne de paramètres incorrecte"
Else
'# On supprime les guillemets de la chaine finale
vsCommandLine = Replace(vsCommandLine, ChrW$(34), vbNullString)
'# On découpe la ligne de commande à chaque \0 rencontré
ParseCommandLine = Split(vsCommandLine, vbNullChar)
End If
Else
ReDim ParseCommandLine(0) As String
End If
End Function
Messages postés
78
Date d'inscription
samedi 16 mars 2002
Statut
Membre
Dernière intervention
7 septembre 2006

Si il y a aucune quotes, à la fin de la boucle de vérification, bQuotes est true, et donc pas de messages d'erreur.
J'ai testé la fonction avec plusieurs cas de figure, cela marche parfaitement.
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
41
tu proposes d'initialiser à true. mais s'il n'y a aucune quote????
++
Messages postés
78
Date d'inscription
samedi 16 mars 2002
Statut
Membre
Dernière intervention
7 septembre 2006

La seule chose qui importe est de savoir si on a un nombre pair (correct) ou impair (incorrect) de quotes. A la fin de la boucle, si bQuotes est false, c'est qu'il y a un nombre impair de quotes ==> message d'erreur.
Quand à la simplicité du code, elle me parrait évidente : qu'est-ce qui est plus lisible : "if cBool(nQuotes and 1) Then..." ou "if not bQuotes Then..." ?
Afficher les 45 commentaires