Page 1 sur 1
[R] Affichage du résultat d'une commande DOS dans ListBox
Posté : jeu. 05 mai 2011 14:27
par neg
Bonjour,
étant totalement débutant avec autoit, je viens rechercher votre aide pour quelques problèmes et questions,
Je suis en train d'écrire une petite application qui doit afficher le résultat d'une commande dos dans une listbox, mais j'ai quelques petits souci:
Ma commande est de ce type: Run('"c:\chemin\.." -optfile="c:\chemin\..." -option=*** -option=*** -option=*** "select *** from *** where type='****'")
Le premier problème viens des
' ' dans la requête sql, je cherche à savoir comment faire pour qu'autoit ne les interprète pas? J'ai testé avec "' '" ou '' '' mais sans succès.
De plus, je voudrais récupérer le résultat (une liste) de cette commande dans une listbox, j'ai écrit ceci pour le moment:
Code : Tout sélectionner
;gui
$GUI1 = GUICreate("GUI", 300, 450, 300, 200)
;listbox
$LISTBOX = GUICtrlCreateList("", 40, 80, 220, 150)
;bouton
$SHOW = GUICtrlCreateButton("Show", 200, 30, 90, 20)
...
GUISetState(@SW_SHOW, $GUI1)
While 1
$nMsg = GUIGetMsg() ;
Switch $nMsg ;
Case $SHOW
$COMMAND='"c:\chemin\.." -optfile="c:\chemin\..." -option=*** -option=*** -option=*** "select *** from *** where type='****'"'
;$CMD=Execute($COMMAND) ;test avec execute
$CMD=Run('$COMMAND')
GuiCtrlSetData($LISTBOX, $CMD)
EndSwitch
WEnd
Si quelqu'un peut me donner un petit coup de main la dessus je l'en remercie d'avance.
J'ai également une petite question: es-ce possible de faire une comparaison du contenu de deux listbox et afficher le résultat dans une 3e listbox?
Merci
Re: [..] Affichage du résultat d'une commande dos dans listb
Posté : jeu. 05 mai 2011 14:32
par SurPriseS
Pour la cmd dos, peut être en envoyant le tout dans un fichier, et en allant lire se fichier après ?
Re: [..] Affichage du résultat d'une commande dos dans listb
Posté : jeu. 05 mai 2011 15:12
par neg
Merci SurPriseS,
j'y ai pensé aussi mais si possible je préfèrerai pouvoir le faire sans passer par un fichier, mais je garde l'idée dans un coin

Re: [..] Affichage du résultat d'une commande dos dans listb
Posté : jeu. 05 mai 2011 15:13
par ZDS
Bonjour!
Pour la commande DOS à traiter, il y a beaucoup d'exemples sur ce cas en utilisant les regexps (moteur de recherche "regexp espace guillemet"). Je te laisse voir pour en faire une qui fonctionne. En tout cas c'est complètement inutile de passer par un fichier (j'en vois même pas le sens en fait... :s)
L'autre méthode est de séparer ta chaine avec les espaces , et de recoller les morceaux qui doivent l'etre, c'est sans doute plus facile. Je te prépare un exemple dans l'après midi.
Enfin, quand tu dis que tu veux afficher les données dans la listBox, je suppose que tu veux séparer chaque morceau de la chaine de caractères pour les mettres dans des choix différents de la listBox?
A bientôt !
EDIT: Voici l'exemple de script, dis moi si c'est le résultat que tu en attendais :
► Afficher le texte
Code : Tout sélectionner
Local $chaine = '"c:\chemin\.." -optfile="c:\chemin\..." -option=*** -option=*** -option=*** ' & '"select *** from *** where type='&"'***'"&'"'
Local $tableau = splitArguments($chaine)
For $i = 1 To $tableau[0]
MsgBox(0, "Resultat n°" & $i, $tableau[$i])
Next
#Region Fonctions de séparation des arguments
Func splitArguments($string)
Local $split = StringSplit($string," "), $index=1, $betweenQuotes = False
; Pour chaque morceau entre espaces
For $i = 1 To $split[0]
Local $sousChaine = $split[$i]
If $betweenQuotes Then ; Si on a trouvé un guillemet auparavant
$split[$index] = $split[$index]&" "&$sousChaine ; on recolle avec la chaine de départ
$split[$i] = "" ; on efface la ligne en cours
If Mod(numberOf($sousChaine,'"'),2) = 1 Then $betweenQuotes = False ; si on trouve 2k+1 guillemet, alors le bloc entre guillemet est fini
Else ; Si on est sans guillemet
If Mod(numberOf($sousChaine,'"'),2) = 1 Then ; si on trouve 2k+1 guillemet, alors le bloc entre guillemet commence
$betweenQuotes = True
$index = $i ; on fixe l'index de départ du bloc
EndIf
EndIf
Next
; On efface toutes les lignes vides
Local $gap = 0, $size = 0
For $i = 1 To $split[0]
If $split[$i] = "" Then
$gap = $gap+1
Else
$size = $size+1
$split[$i-$gap] = $split[$i]
EndIf
Next
; On redimensionne le tableau
ReDim $split[$size+1]
$split[0] = $size
; On retourne le resultat
Return $split
EndFunc
Func numberOf($string, $char)
Local $i = 0
; Tant qu'on trouve le caractère n°($i+1), on continue
While StringInStr($string, $char, 0, $i+1) <> 0
$i = $i + 1
WEnd
Return $i
EndFunc
#EndRegion
Re: [..] Affichage du résultat d'une commande dos dans listb
Posté : jeu. 05 mai 2011 15:32
par jchd
Tu n'as pas la possibilité d'exécuter ta requête SQL directement depuis AutoIt ? Quel moteur de BDD est en face ?
Re: [..] Affichage du résultat d'une commande dos dans listb
Posté : jeu. 05 mai 2011 15:40
par sksbir
neg a écrit :Bonjour,
..........Le premier problème viens des ' ' dans la requête sql, je cherche à savoir comment faire pour qu'autoit ne les interprète pas? J'ai testé avec "' '" ou '' '' mais sans succès.
....
Bonjour
mmm, alors la commande c'est quoi ? sqlplus.exe ? Quoi qu'il en soit, ce que tu cherches à récupérer, ça n'est pas le résultat d'une commande DOS, mais le résultat d'un exécutable qui fonctionne en mode console.
Si tu voulais le résultat d'une commande DOS ( comme par exemple DIR ), il te faudrait utiliser l'astuce décrite dans l'aide de run/runwait : RunWait(@ComSpec & " /c " & "commandName")
Par ailleurs, tu dois également utiliser cette astuce si tu veux profiter de la redirection de fichiers ( > ou >> )
Concernant les ' et les ": A la base, il suffit de doubler la quote utilisée comme délimiteur.
exemple : $TEST=' je veux une simple quote ici -->''<-- donc j''en met 2 simples (et non pas une double hein..) '
ou sinon
$TEST=" je veux une quote ici-->'<-- comme je délimite avec des doubles quotes, pas besoin de doubler les simples"
Donc si tu as des soucis avec les ', essaye d'encapsuler ta commande avec des " et non plus avec des '
Ta commande devient alors: ( les " deviennent "" car " est utilisé comme délimiteur )
$COMMAND="""c:\chemin\.."" -optfile=""c:\chemin\..."" -option=*** -option=*** -option=*** ""select *** from *** where type='****'"" "
Et au fait, tout ceci est expliqué dans l'aide d'autoit ( F1 --> Autoit-->Language reference --> datatype --> "strings" )
voili voilou...
Re: [..] Affichage du résultat d'une commande dos dans listb
Posté : jeu. 05 mai 2011 15:51
par ZDS
Argh !
Mea culpa; tu veux afficher le résultat de ta requête SQL dans la listBox, et non les arguments de ta commande d'appel, c'est ça?
Si oui, le code fourni précédemment ne te sert à rien, mais qu'est ce que ça peut bien te faire qu'AutoIt interprète la commande SQL? puisque au moment de l'appel, le receveur "c:\chemin\..." saura que le bloc entre guillemet est une commande entière non? (et d'ailleurs, où est ce que tu vois que la commande est interpretée?)
PS: sksbir a raison, tu ne peux pas récupérer comme ça le contenu d'une requête SQL par un Run (qui ne retourne qu'un PID ou un code d'erreur, rien d'autre), il faut que tu passes par une UDF pour ça.
Re: [..] Affichage du résultat d'une commande dos dans listb
Posté : jeu. 05 mai 2011 16:46
par neg
Ok, merci pour les précisions, et sa fonctionne niquel avec les "", merci!
En fait oui la commande lance un exécutable (à qui je passe en option un fichier de conf et des options) qui ensuite lance la requête sql.
La du coup avec le run je récupère bien la sortie de la commande, par exemple dans un fichier texte:
Run("""c:\chemin\.."" -optfile=""c:\chemin\..."" -option=*** -option=*** -option=*** ""select *** from *** where type='****'""> C:\test.txt")
Je vais voir du côté UDF alors, merci.
Et merci pour l'exemple de script ZDS, mais oui je veux juste récupérer le résultat de la requête dans ma listbox.
@jchd: non je ne peux pas exécuter directement la requête depuis autoit, mais oui sinon c'est sur que sa serai plus simple

Re: [..] Affichage du résultat d'une commande DOS dans ListB
Posté : ven. 06 mai 2011 13:31
par neg
Bonjour,
à priori sa va marcher comme sa, je récupère la sortie de la commande dans un fichier et le compare avec un autre.
Par contre je bloque un peu sur la comparaison de fichiers, pourriez-vous me dire s'il existe un genre de "while read line" avec autoit?
j'ai écrit sa:
Code : Tout sélectionner
While 1
$line = FileReadLine($file_list)
If @error = -1 Then ExitLoop
GuictrlSetData ($LIST1, $line)
While 1
$line2 = FileReadLine($file_list2)
If @error = -1 Then ExitLoop
If ($line2 <> $line) Then
GuictrlSetData ($LIST2, $line2)
EndIf
Wend
FileClose($file_list2)
Wend
FileClose($file_list)
mais il sort de boucle dès la première occurrence,
j'imagine que sa viens du While 1 et If @error = -1 Then ExitLoop, donc je cherche à savoir comment lui dire de comparer chaque ligne de $file_list avec toutes les lignes de $file_list2?
Merci d'avance
Re: [..] Affichage du résultat d'une commande DOS dans ListB
Posté : ven. 06 mai 2011 14:51
par ZDS
Bonjour,
Ce que tu passes dans le FileReadLine est un flux, et non un fichier, c'est pourquoi après un tour de boucle dans le second while, le flux $file_list2 est arrivé en bout de course, il faut le réinitialiser :
► Afficher le texte
Code : Tout sélectionner
$file_list = FileOpen($fichier, 0) ; Un truc du genre
While 1
$line = FileReadLine($file_list)
If @error = -1 Then ExitLoop
GuictrlSetData ($LIST1, $line)
$file_list2 = FileOpen($fichier2, 0) ; Un autre truc du genre
While 1
$line2 = FileReadLine($file_list2)
If @error = -1 Then ExitLoop
If ($line2 <> $line) Then GuictrlSetData ($LIST2, $line2)
Wend
FileClose($file_list2)
Wend
FileClose($file_list)
Sinon, question algo, je ne vois pas ce que ton script peut faire, car en fait il va afficher n fois la même ligne du fichier 2 si il existe n lignes du fichier 2 qui ne sont pas les mêmes que dans le 1, du point de vue logique, c'est assez idiot, non? ^^ Tu veux faire quoi : afficher toutes les lignes des deux fichiers sans aucun doublon? afficher les lignes du fichier 1 qui sont aussi (ou qui ne sont pas) dans le fichier 2 ? etc...
Donne nous plus d'infos
A bientôt !
Re: [..] Affichage du résultat d'une commande DOS dans ListB
Posté : ven. 06 mai 2011 15:37
par neg
Merci pour ta réponse,
oui en fait j'ai mit ces deux lignes plus haut dans mon script
$file_list = FileOpen($fichier, 0)
$file_list2 = FileOpen($fichier2, 0)
En fait je veux afficher dans une listbox les lignes du fichier 2 seulement si elles ne sont pas dans le fichier1, mais je viens de réussir avec
à la place de
Code : Tout sélectionner
...If ($line2 <> $line) Then GuictrlSetData ($LIST2, $line2)...
Donc c'est bon, je vais essayer de réécrire sa proprement sans utiliser de fichiers mais pour le moment sa ira
Merci pour ton aide en tout cas!
Re: [R] Affichage du résultat d'une commande DOS dans ListBo
Posté : ven. 06 mai 2011 16:13
par jchd
Pour la question de la comparaison de fichiers ou (problème essentiellement équivalent) trouver ou supprimer les doublons dans 2 à n fichiers texte, voir
ce fil de discussion (en anglais). Les méthodes exposées permettent de traiter des fichiers assez gros (avec ScriptingDictionary) ou dépassant de loin la mémoire disponible (avec SQlite) et ont toutes deux une complexité en O(N Log(N)).
S'il ne s'agit que de quelques lignes, la méthode brutale suffira (complexité en O(N M))