Accueil > > > DÉCOMPOSER LES ARGUMENTS D'UNE LIGNE DE COMMANDE (GÈRE LES GUILLEMETS)
DÉCOMPOSER LES ARGUMENTS D'UNE LIGNE DE COMMANDE (GÈRE LES GUILLEMETS)
Information sur la source
Description
A partir d'une ligne de commande, cette fonction renvoie un tableau contenant la commande et ses arguments. Le code gère l'emploi des guillemets. Ainsi, si votre commande est: shell "c:\program files\..." l'argument renvoyé sera "c:\program files" et non "c:\program". Utilisation: - si vous voulez traiter Command() quand votre appli se lance avec des arguments - si vous voulez créer vos propres commandes dans une appli du style 'Console perso.' J'espère que le code n'est pas trop embrouillé (la deuxiéme partie fait un peu usine à gaz); pour toute question et surtout pour toute amélioration, n'hésitez pas.
Source
- Option Explicit
-
- ' Ce type de données contient les infos. relatives à l'occurrence des arguments
- Public Type TempType
- Pos1 As Integer 'Position de début dans strArgLine
- pos2 As Integer 'Position de fin dans strArgLine
- Filled As Boolean 'Si les champs Pos1 et Pos2 sont tous les deux renseignés
- Done As Boolean 'Quand l'argument a été passé en revue
- End Type
-
- Sub main()
-
- ' Cette Sub ne sert qu'à tester la fonction ParseCommandLine
-
- Dim CmdLine As String
- Dim CommandLine() As String
-
- 'C'est une ligne de commande de test
- CmdLine = "copy /Y c:\winnt\notepad.exe ""c:\program files"""
-
- 'Appel de la fonction, qui renvoie un tableau
- CommandLine() = ParseCommandLine(CmdLine)
-
- 'Ce tableau contient:
- '- en index 0, la commande
- '- en index > 0, les arguments
- Dim i As Integer
- For i = 0 To UBound(CommandLine())
- MsgBox CommandLine(i)
- Next i
-
- End Sub
-
- Public Function ParseCommandLine(strCommandLine As String) As String()
-
- Dim strArgs() As String 'Tableau temporaire contenant certains des arguments
- Dim CommandLine() As String 'Tableau temporaire contenant la commande et tous les arguments
-
- Dim strArgLine As String 'la chaîne contenant les arguments
- Dim strTemp As String 'Chaîne temporaire de traitement intermédiare
-
- Dim pos As Integer
- Dim pos2 As Integer
-
- Dim i As Integer
- Dim j As Integer
- Dim k As Integer
-
-
- '/ Traitement de strCommandLine
-
- strCommandLine = Trim(strCommandLine) 'On enlève les espaces
- If strCommandLine = "" Then Exit Function 'Si la ligne est vide, il n'y a rien à traiter
-
- ' On regarde s'il la commande est précédée d'arguments ou non
- pos = InStr(1, strCommandLine, " ")
-
- If pos = 0 Then
- 'Il n'y a pas d'arguments
- ReDim CommandLine(0) 'On dimensionne le tableau
- CommandLine(0) = strCommandLine 'On le remplit à l'index 0 avec la commande
- strArgLine = "" 'Pas d'arguments à traiter
- Else
- ReDim CommandLine(0) 'On dimensionne le tableau
- CommandLine(0) = Mid(strCommandLine, 1, pos - 1) 'On le remplit à l'index 0 avec la commande
- strArgLine = Mid(strCommandLine, pos + 1) 'On récupère les arguments à traiter
- End If
-
-
- '/ Traitement de la chaîne contenant les arguments (strArgLine)
-
- strArgLine = Trim(strArgLine) 'On enlève les espaces
- pos = InStr(1, strArgLine, """") 'On regarde si la chîne contient des guillemets
-
- If pos = 0 Then 'Pas de guillemets
-
- 'Combien d'arguments ?
- pos2 = InStr(1, strArgLine, " ")
-
- If pos2 = 0 Then 'Un seul argument
-
- ReDim Preserve CommandLine(1)
- CommandLine(1) = strArgLine
-
- Else 'Plusieurs arguments
-
- 'On utilise un tableau intermédiaire pour y stocker les arguments
- strArgs() = Split(strArgLine, " ")
-
- 'On ajoute au tableau de résultat le contenu du tableau intermédiaire
- For i = 0 To UBound(strArgs())
- ReDim Preserve CommandLine(i)
- CommandLine(i) = strArgs(i)
- Next i
-
- End If
-
-
- Else 'Il y a des guillemets, c'est ici que ça se complique
-
- 'Dans ce tableau, on stocke les mots séparés par des guillemets
- Dim intTemps As Integer
- Dim Temp() As TempType
-
- 'On dimensionne le tableau
- intTemps = 0
- ReDim Temp(intTemps)
-
- 'On définit le tableau comme étant vide à l'index concerné (0)
- Temp(intTemps).Filled = False
-
-
- ' /On remplit le tableau avec la position de début et de fin des chaînes contenues entre guillemets
-
- 'On fixe la position de départ de la recherche des guillemets au 1er caractère de la chaîne des arguments
- pos = 1
- While pos <> 0
- 'On recherche la position des guillemets
- pos = InStr(pos, strArgLine, """")
- If pos <> 0 Then
-
- 'Si le tableau est complété à l'index concerné, on incrémente l'index et on redimensionne le tableau en conséquence
- If Temp(intTemps).Filled = True Then
- intTemps = intTemps + 1
- ReDim Preserve Temp(intTemps)
- Temp(intTemps).Filled = False
- End If
-
- 'Si la position de début n'a pas été stockée
- If Temp(intTemps).Pos1 = 0 Then
- 'On la stocke
- Temp(intTemps).Pos1 = pos
- 'Si la position de fin n'a pas été stockée
- ElseIf Temp(intTemps).pos2 = 0 Then
- 'On la stocke
- Temp(intTemps).pos2 = pos
- 'On définit le tableau comme étant complété à l'index concerné (intTemps)
- Temp(intTemps).Filled = True
- End If
-
- 'On incrémente la position de départ de la recherche des guillemets, pour ne pas tourner en rond
- pos = pos + 1
-
- End If
- Wend
-
-
- 'Dans ce tableau, on stocke les mots séparés par des espaces
- Dim Temp2a() As String
- Temp2a = Split(strArgLine, " ")
-
- 'Dans ce tableau, on stocke la position des mots séparés par des espaces
- Dim intTemps2 As Integer
- Dim Temp2() As TempType
- intTemps2 = 0
-
- For i = 0 To UBound(Temp2a)
- intTemps2 = intTemps2 + 1
- ReDim Preserve Temp2(intTemps2)
-
- Temp2(intTemps2).Pos1 = Len(GetTable(Temp2a(), 0, i - 1)) + i * 1 + 1
- Temp2(intTemps2).pos2 = Temp2(intTemps2).Pos1 + Len(Temp2a(i)) - 1
- Next i
-
-
- 'Maintenant, on ajoute au tableau final les différents éléments (élément séparés par des espaces et éléments situés entre guillemets), en supprimant les redondances, ie. les éléments séparés par des espaces ET situés entre guillemets
-
- Dim Found As Boolean
-
- For i = 1 To intTemps2
-
- 'Par défaut, la chaîne séparée par des espaces ne correspond pas à une chaîne placée entre guillemets
- Found = False
-
- For j = 0 To intTemps
-
- If Temp2(i).Pos1 = Temp(j).Pos1 Then
- 'Si la chaîne ne correspond pas à une chaîne placée entre guillemets
- Found = True
-
- 'On ajoute la chaîne entre guillemets au tableau final des arguments
- ReDim Preserve CommandLine(UBound(CommandLine()) + 1)
- CommandLine(UBound(CommandLine())) = Mid(strArgLine, Temp(j).Pos1, Temp(j).pos2 - Temp(j).Pos1 + 1)
-
- 'On définit qu'elle a été traitée
- Temp2(i).Done = True
-
- 'Pour les chaînes séparées par des espaces qui appartiennent à la chaîne placée entre guillemets,
- 'on définit qu'elles ont été traitées.
- For k = i To intTemps2
- If Temp2(k).pos2 <= Temp(j).pos2 Then
- Temp2(k).Done = True
- End If
- Next k
-
- End If
- Next j
-
- If Found = False Then 'La chaîne ne correspond pas à une chaîne placée entre guillemets
-
- If Temp2(i).Done = False Then 'Sil la chaîne n'a pas été traitée auparavant
-
- 'On l'ajoute au tableau final des arguments
- ReDim Preserve CommandLine(UBound(CommandLine()) + 1)
- CommandLine(UBound(CommandLine())) = Mid(strArgLine, Temp2(i).Pos1, Temp2(i).pos2 - Temp2(i).Pos1 + 1)
-
- 'On définit qu'elle a été traitée
- Temp2(i).Done = True
- End If
-
- End If
-
- Next i
-
- End If
-
- 'On renvoie le résultat de la fonction
- ParseCommandLine = CommandLine()
-
- End Function
-
-
- ' Cette function rassemble en une chaîne les éléments d'un tableau (sans y mettre les séparateurs), d'un index de début à un index de fin.
- Function GetTable(strTable() As String, IndexFrom As Integer, IndexTo As Integer)
-
- Dim i As Integer
- Dim strTemp As String
-
- For i = IndexFrom To IndexTo
- strTemp = strTemp & strTable(i)
- Next i
-
- GetTable = strTemp
- End Function
-
Option Explicit
' Ce type de données contient les infos. relatives à l'occurrence des arguments
Public Type TempType
Pos1 As Integer 'Position de début dans strArgLine
pos2 As Integer 'Position de fin dans strArgLine
Filled As Boolean 'Si les champs Pos1 et Pos2 sont tous les deux renseignés
Done As Boolean 'Quand l'argument a été passé en revue
End Type
Sub main()
' Cette Sub ne sert qu'à tester la fonction ParseCommandLine
Dim CmdLine As String
Dim CommandLine() As String
'C'est une ligne de commande de test
CmdLine = "copy /Y c:\winnt\notepad.exe ""c:\program files"""
'Appel de la fonction, qui renvoie un tableau
CommandLine() = ParseCommandLine(CmdLine)
'Ce tableau contient:
'- en index 0, la commande
'- en index > 0, les arguments
Dim i As Integer
For i = 0 To UBound(CommandLine())
MsgBox CommandLine(i)
Next i
End Sub
Public Function ParseCommandLine(strCommandLine As String) As String()
Dim strArgs() As String 'Tableau temporaire contenant certains des arguments
Dim CommandLine() As String 'Tableau temporaire contenant la commande et tous les arguments
Dim strArgLine As String 'la chaîne contenant les arguments
Dim strTemp As String 'Chaîne temporaire de traitement intermédiare
Dim pos As Integer
Dim pos2 As Integer
Dim i As Integer
Dim j As Integer
Dim k As Integer
'/ Traitement de strCommandLine
strCommandLine = Trim(strCommandLine) 'On enlève les espaces
If strCommandLine = "" Then Exit Function 'Si la ligne est vide, il n'y a rien à traiter
' On regarde s'il la commande est précédée d'arguments ou non
pos = InStr(1, strCommandLine, " ")
If pos = 0 Then
'Il n'y a pas d'arguments
ReDim CommandLine(0) 'On dimensionne le tableau
CommandLine(0) = strCommandLine 'On le remplit à l'index 0 avec la commande
strArgLine = "" 'Pas d'arguments à traiter
Else
ReDim CommandLine(0) 'On dimensionne le tableau
CommandLine(0) = Mid(strCommandLine, 1, pos - 1) 'On le remplit à l'index 0 avec la commande
strArgLine = Mid(strCommandLine, pos + 1) 'On récupère les arguments à traiter
End If
'/ Traitement de la chaîne contenant les arguments (strArgLine)
strArgLine = Trim(strArgLine) 'On enlève les espaces
pos = InStr(1, strArgLine, """") 'On regarde si la chîne contient des guillemets
If pos = 0 Then 'Pas de guillemets
'Combien d'arguments ?
pos2 = InStr(1, strArgLine, " ")
If pos2 = 0 Then 'Un seul argument
ReDim Preserve CommandLine(1)
CommandLine(1) = strArgLine
Else 'Plusieurs arguments
'On utilise un tableau intermédiaire pour y stocker les arguments
strArgs() = Split(strArgLine, " ")
'On ajoute au tableau de résultat le contenu du tableau intermédiaire
For i = 0 To UBound(strArgs())
ReDim Preserve CommandLine(i)
CommandLine(i) = strArgs(i)
Next i
End If
Else 'Il y a des guillemets, c'est ici que ça se complique
'Dans ce tableau, on stocke les mots séparés par des guillemets
Dim intTemps As Integer
Dim Temp() As TempType
'On dimensionne le tableau
intTemps = 0
ReDim Temp(intTemps)
'On définit le tableau comme étant vide à l'index concerné (0)
Temp(intTemps).Filled = False
' /On remplit le tableau avec la position de début et de fin des chaînes contenues entre guillemets
'On fixe la position de départ de la recherche des guillemets au 1er caractère de la chaîne des arguments
pos = 1
While pos <> 0
'On recherche la position des guillemets
pos = InStr(pos, strArgLine, """")
If pos <> 0 Then
'Si le tableau est complété à l'index concerné, on incrémente l'index et on redimensionne le tableau en conséquence
If Temp(intTemps).Filled = True Then
intTemps = intTemps + 1
ReDim Preserve Temp(intTemps)
Temp(intTemps).Filled = False
End If
'Si la position de début n'a pas été stockée
If Temp(intTemps).Pos1 = 0 Then
'On la stocke
Temp(intTemps).Pos1 = pos
'Si la position de fin n'a pas été stockée
ElseIf Temp(intTemps).pos2 = 0 Then
'On la stocke
Temp(intTemps).pos2 = pos
'On définit le tableau comme étant complété à l'index concerné (intTemps)
Temp(intTemps).Filled = True
End If
'On incrémente la position de départ de la recherche des guillemets, pour ne pas tourner en rond
pos = pos + 1
End If
Wend
'Dans ce tableau, on stocke les mots séparés par des espaces
Dim Temp2a() As String
Temp2a = Split(strArgLine, " ")
'Dans ce tableau, on stocke la position des mots séparés par des espaces
Dim intTemps2 As Integer
Dim Temp2() As TempType
intTemps2 = 0
For i = 0 To UBound(Temp2a)
intTemps2 = intTemps2 + 1
ReDim Preserve Temp2(intTemps2)
Temp2(intTemps2).Pos1 = Len(GetTable(Temp2a(), 0, i - 1)) + i * 1 + 1
Temp2(intTemps2).pos2 = Temp2(intTemps2).Pos1 + Len(Temp2a(i)) - 1
Next i
'Maintenant, on ajoute au tableau final les différents éléments (élément séparés par des espaces et éléments situés entre guillemets), en supprimant les redondances, ie. les éléments séparés par des espaces ET situés entre guillemets
Dim Found As Boolean
For i = 1 To intTemps2
'Par défaut, la chaîne séparée par des espaces ne correspond pas à une chaîne placée entre guillemets
Found = False
For j = 0 To intTemps
If Temp2(i).Pos1 = Temp(j).Pos1 Then
'Si la chaîne ne correspond pas à une chaîne placée entre guillemets
Found = True
'On ajoute la chaîne entre guillemets au tableau final des arguments
ReDim Preserve CommandLine(UBound(CommandLine()) + 1)
CommandLine(UBound(CommandLine())) = Mid(strArgLine, Temp(j).Pos1, Temp(j).pos2 - Temp(j).Pos1 + 1)
'On définit qu'elle a été traitée
Temp2(i).Done = True
'Pour les chaînes séparées par des espaces qui appartiennent à la chaîne placée entre guillemets,
'on définit qu'elles ont été traitées.
For k = i To intTemps2
If Temp2(k).pos2 <= Temp(j).pos2 Then
Temp2(k).Done = True
End If
Next k
End If
Next j
If Found = False Then 'La chaîne ne correspond pas à une chaîne placée entre guillemets
If Temp2(i).Done = False Then 'Sil la chaîne n'a pas été traitée auparavant
'On l'ajoute au tableau final des arguments
ReDim Preserve CommandLine(UBound(CommandLine()) + 1)
CommandLine(UBound(CommandLine())) = Mid(strArgLine, Temp2(i).Pos1, Temp2(i).pos2 - Temp2(i).Pos1 + 1)
'On définit qu'elle a été traitée
Temp2(i).Done = True
End If
End If
Next i
End If
'On renvoie le résultat de la fonction
ParseCommandLine = CommandLine()
End Function
' Cette function rassemble en une chaîne les éléments d'un tableau (sans y mettre les séparateurs), d'un index de début à un index de fin.
Function GetTable(strTable() As String, IndexFrom As Integer, IndexTo As Integer)
Dim i As Integer
Dim strTemp As String
For i = IndexFrom To IndexTo
strTemp = strTemp & strTable(i)
Next i
GetTable = strTemp
End Function
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Argument de ligne de commande [ par sheur60 ]
Je cherche a récupérer des arguments passer en ligne de commande de mon programme. Par exemple, si mon raccourci est C:\Prog.exe /toto, je cherche à r
Argument de ligne de commande [ par sheur60 ]
Je cherche a récupérer des arguments passer en ligne de commande de mon programme. Par exemple, si mon raccourci est C:\Prog.exe /toto, je cherche à r
line argument [ par terriblepat ]
bonjour,je cherche la commande qui va me permettre de récupérer un argument sur la ligne de commande ?the terrible terriblepat
passage argument ligne de commande [ par jarni ]
Quoi ecrire dans monprog.exe (créé en VB6) pour que le fichier taratata.xyz soit passé comme argument à monprog.exe dans un ultérieur:shell monprogr.e
probleme argument ligne de commande URGENT [ par kevinscherrens ]
Commen changer la valeur de l'argument de la ligne de commande dans le code de VB?MERCI D'AVANCE
argument en ligne de commande [ par mesdebuts ]
Bonjour à toutes et à tous ! J'ai actuellement un souci dans un programme en VB.Je m'explique, j'ai créé un programme qui va parcourir
argument en ligne de commande [ par aurbadguy ]
je sais qu'il est possible de recuperer ces arguments avec la fonction split sur la variables commandDim args() As Stringargs = Split(Command(), " ")<
commande shell [ par Jeff ]
Salut!!J'ai 1 commande shell qui lance 1 fichier a.batsi je mets 0 à l'argument Windowstyle le .bat fonctionneor si je veux cacher la fenetre lors de
argument en ligne de commande [ par cartman29 ]
Bonjour, Je travail actuellement sur un projet VB.NET pour une copie de fichier seulement je dois faire une sauvegarde journalière des données. J'a
erreur de syntaxe dans access (3075) [ par real47 ]
J'ai un probleme que je ne trouve pas a resoudre dans ma base de donné access J'ai toujours un message d'erreur 3075 qui apparait lorsque que je clik
|
Derniers Blogs
TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|