RECUPÉRER DES PARAMÈTRES SUR LA LIGNE DE COMMANDE

econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 - 16 sept. 2005 à 16:21
dede38440 Messages postés 7 Date d'inscription vendredi 1 juillet 2011 Statut Membre Dernière intervention 24 août 2014 - 28 juin 2011 à 14:09
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/33816-recuperer-des-parametres-sur-la-ligne-de-commande

dede38440 Messages postés 7 Date d'inscription vendredi 1 juillet 2011 Statut Membre Dernière intervention 24 août 2014
28 juin 2011 à 14:09
Merci ! Bien expliqué, facile à personnaliser.
Slee84 Messages postés 5 Date d'inscription samedi 18 mars 2006 Statut Membre Dernière intervention 2 avril 2008
25 mai 2007 à 11:41
Bonjour,

j'ai modifié la source présentée en prenant comme séparateur le caractère "" qui précèdera les noms de paramêtres.
Ce détail permet le passage des parametres dont les valeurs contiennent des espaces.

Rien de bien énorme en somme...


commande : toto.exe \PARAM1=mon Test \PARAM2=Cool \PARAM3=ALFRED
ou toto.exe \PARAM1:mon Test \PARAM2:Cool \PARAM3:ALFRED
l'utilisation reste la même : sRecupererParamLigneCommande("PARAM1")





Function sRecupererParamLigneCommande(ByVal sNomParametre As String) As String

Dim iPos As Integer
Dim iposFin As Integer

' on recherche le nom de parametre
iPos = InStr(Command$, sNomParametre)
If iPos > 0 Then
iposFin = InStr(iPos, Command$, "")
If iposFin > 0 Then
' on a un autre paramètre derriere le paramètre
sRecupererParamLigneCommande = Mid$(Command$, iPos + Len(sNomParametre) + 1, iposFin - iPos - Len(sNomParametre) - 1).Trim(" ")
Else
' on est a la fin de la ligne de parametres
sRecupererParamLigneCommande = Mid$(Command$, iPos + Len(sNomParametre) + 1).Trim(" ")
End If
Else
sRecupererParamLigneCommande = ""
End If
End Function
cs_miata Messages postés 86 Date d'inscription mardi 31 août 2004 Statut Membre Dernière intervention 19 août 2008
7 mars 2007 à 14:37
Merci !
pbeauducel Messages postés 2 Date d'inscription lundi 13 novembre 2000 Statut Membre Dernière intervention 9 octobre 2008
7 mars 2007 à 11:45
Bonjour, par besoin j'ai ecrit cette class qui me permet de recupere les parametres de la ligne de commande.

Chaque parametres est placés dans une collection.
pour faire simple elle fait ceci:

Ligne de commande : "-F = "chemin + nom de fichier" -f=toto.txt -bidule
Param 1 = -F
param 2 = chemin + nom de fichier
param 3 = -f
param 4 = toto.txt
param 5 = -bidule

voici mon code si cela peut servir ;-)


Option Explicit

Private ArgCol As New Collection

' 1 = Juste pour executer dans VB, sinon 0
Const DebugCMD As Boolean = 1


Private Sub Class_Initialize()
Dim CmdL As String

If DebugCMD = 0 Then
Call ArgCol.Add(Command()) ' Recupere la ligne de commande
Else
' Ma ligne de commande pour debugage
CmdL "-F " + Chr(34) + "C:\DXFCAM\Escalier\S2\LIMONS\LIM002I1.DXF" + Chr(34)
CmdL = CmdL + " -F=" + Chr(34) + "C:\DXF CAM\Escalier\S2\LIMONS\LIM002I2.DXF" + Chr(34)
Call ArgCol.Add(CmdL)
End If

' Analyse la ligne de commande
Call ArgColInit(ArgCol.Item(1))
End Sub


Private Sub Class_Terminate()
Set ArgCol = Nothing
End Sub


' **************************************
' Retourne la ligne de commande analysée
' **************************************
Public Function LineCmd() As String
LineCmd = ArgCol.Item(1)
End Function


' ***********************************************
' Retourne un parametre n de la ligne de commande
' ***********************************************
Public Function Item(ByVal NumArg As Long) As String
Item = ArgCol.Item(1 + NumArg)
End Function


' *******************************************************
' Retourne le nombre de parametre de la ligne de commande
' *******************************************************
Public Property Get Nb_Arg() As Long
Nb_Arg = ArgCol.Count - 1
End Property


' **************************************************
' Analyse de la ligne de commande passe en parametre
' **************************************************
Private Sub ArgColInit(ByVal chaine As String)
Dim Count As Long
Dim Mode As Long
Dim CodeAscii As String

Dim parm As String

' Coupe a chaque espace et stocke le mot dans une collection et
' toute chaine entre guillemet
parm = ""
Mode = 0
For Count = 1 To Len(chaine)
CodeAscii = Mid(chaine, Count, 1) ' Lit un caractere

If Mode = 0 Then ' Le mode 0, coupe a chaque espace
' --------------------------------

If CodeAscii = "=" Then CodeAscii = " " ' Elimine le symbole =

' Si espace ou guillemet
If CodeAscii " " Or CodeAscii Chr(34) Then

If CodeAscii Chr(34) Then Mode 1 ' Si guillemet de debut passe en mode 1
Call Memorise_Param(parm) ' Memorise le parametre
Else
parm = parm + CodeAscii ' Ajoute un caractere au parametre
End If
Else ' le Mode 1, coupe a chaque guillement
' ------------------------------------

If CodeAscii = Chr(34) Then ' Si guillemet de fin repasse en mode 0
Mode = 0
Call Memorise_Param(parm) ' Memorise le parametre
Else
parm = parm + CodeAscii ' Ajoute un caractere au parametre
End If
End If
Next Count

Call Memorise_Param(parm) ' Memorise le dernier parametre
End Sub

Public Sub Memorise_Param(ByRef chaine As String)
If chaine <> "" Then ' Memorise le parametre si non nul
Call ArgCol.Add(chaine) ' Dans une collection
chaine = "" ' Efface le parametre
End If
End Sub
cs_miata Messages postés 86 Date d'inscription mardi 31 août 2004 Statut Membre Dernière intervention 19 août 2008
16 févr. 2007 à 20:21
Bonjour,

Le code tourne super bien, mais j'ai prob.
Fait clic droit sur un fichier > Oubrir avec > votre EXE
sa renverra :
mon.exe "C:\Le\Chemin du fichier\dans son dossier"

Il y a des espaces dans la commande envoyé, et ton code limite à chaque espace, comment récupérer la valeur entre guillemet ?
cs_nihaoma Messages postés 140 Date d'inscription jeudi 2 mai 2002 Statut Membre Dernière intervention 2 février 2010
14 févr. 2006 à 14:00
heu, laissez tomber, j'ai poser la question sans réfléchir, mais il me suffit en fait de lire le contenu de Command$ pour y répondre.....
désolé pour le spam inutile...
cs_nihaoma Messages postés 140 Date d'inscription jeudi 2 mai 2002 Statut Membre Dernière intervention 2 février 2010
14 févr. 2006 à 13:55
bonjour,

dans le meme esprit, j'ai une petite question,
grace à une bidouille avec la Registry, mon code est appelé quand on clic droit sur un fichier, avec en argument le Path du fichier en question (code.exe %1). Le problème, c'est que je ne connais pas le nom utiliser pour décrir l'argument, est-ce que quelqu'un pourait m'aider svp ?

merci

NiHaoMa
cs_franckydeluka Messages postés 228 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 4 janvier 2008 1
26 janv. 2006 à 14:40
Salut !!

Ah OK je vois ce que tu veux dire.
En fait tu peux mettre autant d'arguments que tu le souhaites mais pour plus de clarté et de simplicité il vaut mieux se limiter car tu es obligé de les définir 1 par 1.

Si tu veux faire quelque chose de plus important et configurable alors il vaut mieux utiliser un fichier de configuration dans le style fichier INI.

voilà bonne prog !!
++
cs_salazar Messages postés 241 Date d'inscription mercredi 1 octobre 2003 Statut Membre Dernière intervention 19 février 2006 1
24 janv. 2006 à 16:05
Merci pour la rapidité de ta réponse !

Ca fontionne bien ! !! 10/10

Dans ton exemple, pour gèrer le passages de plusieurs arguments tu fais :
param = sRecupererParamLigneCommande("/L=")
MsgBox (param)
param = sRecupererParamLigneCommande("/M=")
MsgBox (param)
...

Peut-on ne plus utiliser le L= M= ?
S'il y a n arguments, comment le gère t'on ?


Merci
;o)
cs_franckydeluka Messages postés 228 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 4 janvier 2008 1
24 janv. 2006 à 14:59
Bonjour,
Je fais un exemple très simple parce que c'est vrau que ça peut paraître un peu obscur:

Premièrement ouvrir un projet vierge VB6, puis y copier/coller les fonctions "sRecupererParamLigneCommande" ainsi que "Form_Load" suivantes :





Function sRecupererParamLigneCommande(sNomParametre As String) As String

Dim iPos As Integer
Dim iposFin As Integer

' on recherche le nom de parametre
iPos = InStr(Command$, sNomParametre)
If iPos > 0 Then
iposFin = InStr(iPos, Command$, " ")
If iposFin > 0 Then
' on a un blanc derriere le parametre
sRecupererParamLigneCommande = Mid$(Command$, iPos + Len(sNomParametre), iposFin - iPos - Len(sNomParametre))
Else
' on est a la fin de la ligne de parametres et l'on n'a pas de blancs
sRecupererParamLigneCommande = Mid$(Command$, iPos + Len(sNomParametre))
End If
Else
sRecupererParamLigneCommande = ""
End If
End Function

Private Sub Form_Load()
Dim param As String
param = sRecupererParamLigneCommande("/L=")
MsgBox (param)
End Sub





compiler ensuite le programme et le mettre sur C:\ (il s'appelle par défaut Project1.exe) puis l'appeler dans "Démarrer/éxécuter" comme ceci:

C:\Project1.exe /L=FRANCAIS

Le programme doit afficher dans une Msgbox "FRANCAIS" pour dire qu'il a bien pris en compte l'option FRANCAIS.

Voilà tout simplement ;-)
++
cs_salazar Messages postés 241 Date d'inscription mercredi 1 octobre 2003 Statut Membre Dernière intervention 19 février 2006 1
24 janv. 2006 à 14:06
Bonjour,

Il parait très intéressant ton programme avec passage d'arguments, mais j'éprouve quelques difficultés pour le faire fonctionner avec la commande EXECUTER de windows.
Demarrer/executer/... et là je tappe ton programme Lig_Cde.exe ca marche.
Si j'ajoute des arguments avec différentes syntaxes, ca ne marche plus :
Lig_Cde.exe -play
Lig_Cde.exe /play
Lig_Cde.exe \play
Lig_Cde.exe play

Que faut il exactement taper ? Il y a une étape que je n'ai pas bien compris. Pourriez vous m'expliquer sur un exemple concret...

Merci.
toopix Messages postés 30 Date d'inscription mercredi 2 novembre 2005 Statut Membre Dernière intervention 16 avril 2010
5 déc. 2005 à 11:50
apparement je suis encore plus debutant que débutant, alors est ce que quelqu'un pourrait m'expliquer comment faire si je veux programmer des parametres à mon programme en VB6.
Parce que j'avoue j'ai pas tout saisi.
Merci d'avance.
toopix Messages postés 30 Date d'inscription mercredi 2 novembre 2005 Statut Membre Dernière intervention 16 avril 2010
5 déc. 2005 à 11:50
apparement je suis encore plus debutant que débutant, alors est ce que quelqu'un pourrait m'expliquer comment faire si je veux programmer des parametres à mon programme en VB6.
Parce que j'avoue j'ai pas tout saisi.
Merci d'avance.
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
23 sept. 2005 à 15:46
Ne pas utiliser la fonction Split(), je pense que tu as tord .. c'est bien plus efficace ... code plus court et plus rapide...

Christophe
cs_franckydeluka Messages postés 228 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 4 janvier 2008 1
23 sept. 2005 à 15:37
j'ai mis à jour ma source en simplifiant grandement le code !! Dites-moi ce que vous en pensez..
Merci à tous en tout cas !!

Je n'y ai pas mis la fonction Split car j'y ai préféré la fonction InStr.

DROMAX --> VB.NET mort de rire c'est vrai que c'est beaucoup plus simple! mais c'est moins drôle...
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
23 sept. 2005 à 13:53
Peuh !! VB.NET c'est même pas drôle !! Tout le travail est déjà mâché !!

Christophe
Dromax Messages postés 40 Date d'inscription mercredi 1 janvier 2003 Statut Membre Dernière intervention 23 septembre 2005
23 sept. 2005 à 11:04
Vb.Net :

On utilise la propriété CommandLine de la classe Environment pour avoir la ligne entière dans une chaine de caractères

Console.WriteLine("La ligne de commande est : {0}", Environment.CommandLine)

On utilise GetCommandLineArgs pour obtenir un tableau de chaines de caractères contenant chaque argument.

'Arguments de ligne de commande Console.WriteLine("Arguments de ligne de commande") Dim i As Integer Dim args As String() Environment.GetCommandLineArgs() Dim j As Integer args.Length For i = 0 To j - 1 Console.WriteLine("Args({0}) = {1}", i, args(i)) Next
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
21 sept. 2005 à 03:55
(petite précisions...)

Vi, après, bien évidemment, il suffit d'extraire, dans un premier temps, les chaines inter slashiques "/chaine/" puis d'analyser ces chaines.
Pour se faire, il suffit de séparer la chaine en deux :
chaine_avant_les_deux_point
":"
chaine_après_les_deux_point
et ce en cherchant les ":".
Je te laisse regarder les diverses fonctions de traitements textuels tel que Split, Replace, Mid, Right, ..., ..., ...
Biensûr, cette méthode permettrait de connaître facilement la validité des arguments et ainsi d'éviter de perdre les arguments suivants une erreur :
/D:texte_a_la_con /Echiffre /C:lettres
Bon Faux Bon
>/D:texte_a_la_con /C:lettres

Enjoy
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
21 sept. 2005 à 03:37
Clair!
Non, franchement, c'est à chacun de faire comme il veut! Mais c'est bien quand même (pour les débutants) :-)
Sinon, pour résoudre le prob soulevé par Crenaud76, il suffit, comme la plupart des progs font, de séparer les paramètres par des anti-slashs "" ou des slashs "/". Par exemple :
/Argument:datas /D:bla bla /E:...
Tout simplement!

Enjoy
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
19 sept. 2005 à 10:01
Avec ton code ou avec la fonction Split, il faudra faire très attention aux parametres contenant des espaces ... comme un nom de fichier long entre guillemets !!!
Autre remarque ... Avec ta méthode, si je demande le 1er argument puis le second, puis le troisième,etc ... ton code fait x fois le même boulot (découpage de la chaine notamment) !!
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 25
18 sept. 2005 à 22:39
C'est clair, çà ne vaut quand même pas 2/10. Ton algo est propre et commenté.
cs_Alain Proviste Messages postés 908 Date d'inscription jeudi 26 juillet 2001 Statut Modérateur Dernière intervention 1 février 2015 2
17 sept. 2005 à 16:30
split sera plus performant...
certes on a jamais des milliers de params mais bon...
cs_franckydeluka Messages postés 228 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 4 janvier 2008 1
17 sept. 2005 à 13:19
c'est cool de se pencher sur ma source
Merci les gars. et dès que j'ai le temps j'y ajoute la fonction "split" (je la connaissais déjà mais j'ai préféré boucler va savoir pourquoi...)

enfin je ne pense pas que le fait de ne pas y avoir mis cette fonction vaut en 2/10 à ma source mais c'est vrai que comme le dis ASIMENGO sur sa fiche la clarté et la finesse d'un code est aussi important que sa fonction elle même.

sur ce bonne prog à tous !!
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
17 sept. 2005 à 12:12
Une chose de plus apprise pour moi merci. Néanmoins prends en compte la suggestion de ECONS, tu pourra consulter l'aide sur les fonctions "SPLIT" et "JOIN" qui te seront certainement utiles.

Bonne Continuation.
ghuysmans99 Messages postés 2496 Date d'inscription jeudi 14 juillet 2005 Statut Contributeur Dernière intervention 5 juin 2016 1
16 sept. 2005 à 22:50
pas mal !
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 25
16 sept. 2005 à 16:21
Bel effort.



Pour info, en beaucoup moins de lignes, avec la fonction Split :


Dim tablo() As String
dim slignedecommande As String
slignecommande = "monprog.exe param1 -param2 param3"
tablo = Split(slignecommande, " ", , vbTextCompare)
MsgBox "Nombre d'arguments : " & UBound(tablo)
MsgBox "Deuxième argument : " & tablo(2)
Rejoignez-nous