[C] Convertir mon batch en autoit

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Avatar du membre
labougie
Niveau 4
Niveau 4
Messages : 68
Enregistré le : dim. 03 nov. 2013 14:36
Status : Hors ligne

[C] Convertir mon batch en autoit

#1

Message par labougie »

Bonjour,

Je me lance dans mon premier script autoit 8)

Je souhaite convertir un batch de recherche (sur tous les lecteurs) Os windows.

Voici mon 1er jet

Code : Tout sélectionner

Msgbox(64,'ToolSearch by Labougie','Cet outil analyse soit tous les lecteurs soit celui de ton choix.')

; déclaration des variables
Global $txt = "%SystemDrive%\search.txt"
Global $txt1 = "%temp%\txt1.txt"


; Suppression des fichiers existants
if $txt then
filedelete ("$txt")
EndIf
if $txt1 Then
filedelete ("$txt1")
EndIf
 
Pour l'instant, je cherche le code, ensuite j'inclurai les boucles.

Mon 1er souci est que le fichier search.txt n'est pas supprimé.
En batch la commande est del /a /f /q "path"

Telm m'a fourni ce lien

Si je mets ceci dans mon script
#include<Array.au3>
#include"_FileListToArrayEx.au3"

j'obtiens cette erreur => cannot open include
je ne comprends pas tout, comment s'utilise cette commande?
est elle native ou pas à autoit?

labougie
Modifié en dernier par labougie le mar. 12 nov. 2013 11:59, modifié 1 fois.
Avatar du membre
Sachadee
Niveau 2
Niveau 2
Messages : 23
Enregistré le : dim. 29 sept. 2013 03:50
Status : Hors ligne

Re: [.] Convertir mon batch en autoit

#2

Message par Sachadee »

Salut,
; déclaration des variables
Global $txt = "%SystemDrive%\search.txt"
Global $txt1 = "%temp%\txt1.txt"
En AutoIt le [%var%] n'est pas reconnu.

Tu as des variables d'environnement prédefinie qui ont le format [@Var]

Exemple :

Code : Tout sélectionner

 $RepSystem = @systemdrive
Tu peux avoir la liste dans l'aide AutoIt

Pour celle qui n'existe pas et que tu veux récuperer du "cmd" tu peux utiliser la fonction "EnvGet"

Exemple :

Code : Tout sélectionner

Gobal $txt = EnvGet("systemDrive") & "\search.txt"
 
Modifié en dernier par Sachadee le dim. 10 nov. 2013 18:51, modifié 1 fois.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [.] Convertir mon batch en autoit

#3

Message par Tlem »

labougie a écrit :Si je mets ceci dans mon script
#include<Array.au3>
#include"_FileListToArrayEx.au3"

j'obtiens cette erreur => cannot open include
je ne comprends pas tout, comment s'utilise cette commande?
est elle native ou pas à autoit?
Bonjour.
Avez-vous eu l'idée de consulter la documentation de la commande "include" ?
Comprenez-vous le sens de la phrase "cannot open include" ?
Connaissez-vous l'association de la touche F1 de votre clavier et de l'aide liée à AutoIt dans Scite ?

Edit :
Pour info, le titre d'un sujet doit commencer par [..] et non par [.].
AutoIt ne s'écrit pas tout en minuscule car la signification en serait différente.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [.] Convertir mon batch en autoit

#4

Message par jguinch »

@labougie : comme l'a dit Tlem, il faut impérativement que regardes la doc ainsi que les exemples fournis.
Dans un de tes premiers posts, jl56 t'a suggéré de commencer par le tuto de Timmalos. C'est vraiment un très bon début.
Perso, je te conseille de parcourir la doc (même si c'est juste en survolant) fonction par fonction, et ouvrir les exemples. Même si tu ne te sers pas de toutes les fonctions, tu sauras qu'elles existent le jour où tu en auras besoin.

@Sachadee :
[mode JeFaisLeMalin ON]

Code : Tout sélectionner

AutoItSetOption ("ExpandEnvStrings", 1)
MsgBox(0, "", "%windir%\system32")
[/mode JeFaisLeMalin]
:P :wink:
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
Sachadee
Niveau 2
Niveau 2
Messages : 23
Enregistré le : dim. 29 sept. 2013 03:50
Status : Hors ligne

Re: [.] Convertir mon batch en autoit

#5

Message par Sachadee »

Code : Tout sélectionner

AutoItSetOption ("ExpandEnvStrings", 1)
MsgBox(0, "", "%windir%\system32")
 
Merci pour l'astuce :wink:
Avatar du membre
labougie
Niveau 4
Niveau 4
Messages : 68
Enregistré le : dim. 03 nov. 2013 14:36
Status : Hors ligne

Re: [..] Convertir mon batch en autoit

#6

Message par labougie »

Bonjour,

J'ai modifier le titre [.] par [..]

Concernant les tutos, oui je les lis, mais sans doute que trop pressé, j'ai voulu commencer, et, du coup, ben...
Faut que je lise encore :lol:

J'en suis à la rubrique "tableau", et pour l'aide, cela m'a complétement échappé.
J'ai l'impression que AutoIt et très puissant/complet, après avoir fait le F1.

Il faut que je comprenne la syntaxe de ce nouveau langage.
Tlem a écrit :AutoIt ne s'écrit pas tout en minuscule car la signification en serait différente.
Aussi ce type de syntaxe est il sensible à la casse.
MsgBox et Msgbox sont différents?
Telm a écrit :Comprenez-vous le sens de la phrase "cannot open include" ?
La traduction est simple mais la comprendre en langage de programmation pas du tout.
J'ai demandé d'inclure une "librairie", et celle-ci n'a pas été inscrite, donc non fonctionnelle.
AI-je bien compris le sens de cette phrase?
Sachadee a écrit :En AutoIt le [%var%] n'est pas reconnu.

Tu as des variables d'environnement prédefinie qui ont le format [@Var]

Exemple :

Code
$RepSystem = @systemdrive
Ok j'ai compris cette erreur, pour moi les variables de windows me semblaient acquises dans autoit, ce n'est donc pas le cas.
Je vais donc me faire une chtite lecture de ce coté également.

Il faut donc déclarer en variable avant d'utiliser cette commande "@HomeDrive" par exemple.

Du coup il va falloir que je reprenne les cours d'algorithmique :shock: afin de structurer tout cela dans le bon sens.



labougie
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Convertir mon batch en autoit

#7

Message par Tlem »

Bonsoir.
labougie a écrit :J'ai l'impression que AutoIt et très puissant/complet, après avoir fait le F1.
Je confirme.
labougie a écrit :Il faut que je comprenne la syntaxe de ce nouveau langage.
Je confirme encore. ^^
labougie a écrit :Aussi ce type de syntaxe est il sensible à la casse.
MsgBox et Msgbox sont différents?
Non. Quand je parlais du mot AutoIt, le fait de différencier le I en majuscule permet de prononcé "aow-toh-it" au lieu de "otoi" (J'ai pas appris à écrire en phonétique, mais je pense que mon exemple devrait être compréhensible.
labougie a écrit :J'ai demandé d'inclure une "librairie", et celle-ci n'a pas été inscrite, donc non fonctionnelle.
AI-je bien compris le sens de cette phrase?
Tout à fait. Mais au delà du fait que certaines librairies sont fournies d'origine avec AutoIt, d'autres ne le sont pas. Comme je vous ai indiqué une librairie non standard, vous devez bien évidemment la télécharger et la placer au même endroit que votre script. Ou si vous avez l'intention de l'utiliser régulièrement, vous pouvez aussi la copier dans le dossier Include du dossier d'installation de AutoIt. ;)
labougie a écrit :pour moi les variables de windows me semblaient acquises dans autoit, ce n'est donc pas le cas.
Bien sur que si, elles n'ont simplement pas la même forme dans tous les langages.

En langage AutoIt, "@XXXX" signifie qu'il s'agit de la macro XXXX qui contient la valeur qui lui est associée. Et donc @HomeDrive contient la lettre de lecteur ou est installé le système.
labougie a écrit :Je vais donc me faire une chtite lecture de ce coté également.
Cela me semble indispensable. Pour les macros, c'est par ici => http://www.autoitscript.fr/autoit3/docs/macros.htm
labougie a écrit :Du coup il va falloir que je reprenne les cours d'algorithmique :shock: afin de structurer tout cela dans le bon sens.
Meuhh non. Consultez les exemples qui sont fournis avec chaque commande. Vous verrez que c'est assez simple à la longue.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
labougie
Niveau 4
Niveau 4
Messages : 68
Enregistré le : dim. 03 nov. 2013 14:36
Status : Hors ligne

Re: [..] Convertir mon batch en autoit

#8

Message par labougie »

Bien le bonjour,

J'ai fais quelques lectures, cela vient petit à petit.
Je redonne le fil de conduite.

=> faire le script de façon à ce qu'il soit fonctionnel :shock:
=> quand terminé, l'optimiser afin de mieux comprendre les subtilités :mrgreen:

Je viens de parcourir la commande _FileWriteLog
Une difficulté de composition se présente.
A chaque fois que je frappe -1, la ligne se met en commentaire, je suis donc obligé de faire un "copier_coller" de -1 pour passer.

En suivant cette réflexion
_FileWriteLog($LogFile,"Cette ligne est rajoutée en 1", 1)
_FileWriteLog($LogFile,"Cette ligne est rajoutée en 2", -1)
_FileWriteLog($LogFile,"Cette ligne est rajoutée en 3", -1)
_FileWriteLog($LogFile,"Cette ligne est rajoutée en etc...", -1)

Donc si je souhaite créer une ligne vide je dois faire
_FileWriteLog($LogFile,"", -1)

et l'intercaler, est-ce exact?



► Afficher le texte
Soyez indulgeant dans les commentaires :lol:

Voici le résultat produit
► Afficher le texte

Labougie

Edit, j'ai trouvé pour supprimer
en revanche comment supprimer la date en début de ligne car je ne la voulais qu'en fin de ligne 3
Edit 2 ajout balise code
Modifié en dernier par labougie le jeu. 19 déc. 2013 22:58, modifié 1 fois.
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Convertir mon batch en autoit

#9

Message par jguinch »

labougie a écrit :A chaque fois que je frappe -1, la ligne se met en commentaire, je suis donc obligé de faire un "copier_coller" de -1 pour passer.
C'est parce que la touche "-" du pavé numérique est un raccourci dans Scite pour commenter/dé-commenter une ligne. Tu peux utiliser le "-" de la touche 6 à la place :roll:

Si j'ai bien compris ton problème, tu souhaites écrire une ligne vide dans le fichier de log, c'est ça ?
Dans ce cas, il ne faudra pas utiliser _FileWriteLog.
En effet, comme le dit la doc, _FileWriteLog "écrit la date courante, l'heure et le texte spécifié dans une fichier de log". Donc la date sera forcément écrite, en début de ligne.
Tu pourras utiliser FileWriteLine($LogFile, "")
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
labougie
Niveau 4
Niveau 4
Messages : 68
Enregistré le : dim. 03 nov. 2013 14:36
Status : Hors ligne

Re: [..] Convertir mon batch en autoit

#10

Message par labougie »

Jgunich,

Merci pour le - (6), car c'est franchement galère. De plus au boulot, le pavé numérique est une absolue nécessité, je vais devoir contrôler ma main droite :lol: .

La commande FileWriteLine fonctionne à merveille.

Voici le resultat
► Afficher le texte
J'y vais piano mais surement.

labougie
Avatar du membre
labougie
Niveau 4
Niveau 4
Messages : 68
Enregistré le : dim. 03 nov. 2013 14:36
Status : Hors ligne

Re: [..] Convertir mon batch en autoit

#11

Message par labougie »

Je n'arrive pas à convertir cette partie, mon script me donne une erreur de syntaxe, que je ne trouve pas.

En Batch
%Var% est le mot à charcher
%txt% le logfile de sorti

For %%j in ("%Var%") do (
For %%k in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do if exist %%k: (

(dir "%%k:\*%%j*.*" /a-d /b /s 2^>NUL >> %txt% ) ))

En AutoIt

Local $answer = InputBox("Question", "Quel(s) mot(s) recherches tu ?", "", "")

Local $aArray = DriveGetDrive("ALL")

For $j in $answer
For $k in $aArray ZThen if exist $k: (

;run cmd.exe dir "%%k:\*%%j*.*" /a-d /b /s 2^>NUL >> $LogFile ) ))

L'erreur est sur le Z qui montre l'emplacement de l'erreur de syntaxe, le Z n'existe pas dans le script

Je ne comprends pas l'erreur de syntaxe.
La dernière partie run cmd, n'est pas encore traitée.

labougie
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Convertir mon batch en autoit

#12

Message par Tlem »

Bonjour,
InputBox() renvoi une chaine et non un tableau, donc la première boucle ($j) ne peut pas fonctionner et ne sert à rien !

Ensuite cette ligne :

Code : Tout sélectionner

For $k in $aArray ZThen if exist $k:
contient plusieurs erreurs. Tout d'abord le Z n'a rien à faire ici (ni ailleurs). Ensuite le "Then" et le "If exist" sont de trop pour plusieurs raisons.
La syntaxe d'une boucle est :

Code : Tout sélectionner

For $i In $X
  ; Ligne de code 1
  ; Ligne de code 2
  ; Ligne de code x
Next
ou

Code : Tout sélectionner

For $i = 1 To $x
  ; Ligne de code 1
  ; Ligne de code 2
  ; Ligne de code x
Next
Soit dans votre cas :

Code : Tout sélectionner

[color=#40FF00]For $k in $aArray[/color]
 [color=#FF40BF]If Exist $k Then[/color]
    Run(....)
 [color=#FF40BF]EndIf[/color]
[color=#40FF00]Next[/color]
Maintenant, dans ce code, la condition "If Exist $k" est totalement inutile puisque $aArray contient une liste de lecteurs existants (retourné par le DriveGetDrive()), il est donc inutile de tester quelque chose qui existe.

Concernant le reste de votre code, d'après mes déduction, vous comptez rechercher les fichiers contenant tout ou partie de ce qui à été saisi au départ. Donc pour cela vous allez devoir mettre en forme les mots demandés sous forme de tableau.
Imaginons la recherche saisie comme ceci :

Code : Tout sélectionner

Fichier1 Fichier2 Fichier3
Là pas de problème particulier, on va décomposer la ligne selon les espaces, mais si la recherche est de la forme

Code : Tout sélectionner

Fichier 1 Fichier 2 Fichier 3
Là ça ne va plus aller, car si on décompose selon les espaces, on aura 3 fois le mot Fichier puis les nombres 1, 2 et 3. Vous devez donc déterminer un séparateur spécifique qu'il n'est pas possible de trouver dans le nom d'un fichier. Généralement le caractère '|' fait très bien l'affaire.

Vous devez donc revoir le code de votre question comme ceci :

Code : Tout sélectionner

$sAnswer = InputBox("Question", "Entrez vos recherches séparées par le caractère |", "", "")
A partir de là, $answer pourra être de la forme :

Code : Tout sélectionner

Mot1
Mot 1|Mot2|Mot 3
ceci nous permet à l'aide de la commande StringSplit(), de transformer une suite de chaines de caractères séparées par un caractère spécial en un tableau (en vue de faire une boucle plus simplement qu'avec une chaine). Ce qui nous donne :

Code : Tout sélectionner

#include <Array.au3>  ; Cette ligne n'est là que pour la démonstration

$sAnswer = InputBox("Question", "Entrez vos recherches séparées par le caractère |", "", "")
MsgBox(32, "Chaine", "Voici la recherche sous forme de chaine : " & @LF & $sAnswer) ; Cette ligne n'est là que pour la démonstration
$aAnswer = StringSplit($sAnswer, "|")

_ArrayDisplay($aAnswer) ; Cette ligne n'est là que pour la démonstration
Comme vous pouvez le constater si vous saisissez une recherche du genre "Mot 1|Mot2|Mot 3", la dernière ligne vous affiche un tableau comme ceci :

Code : Tout sélectionner

[0]     3
[1]     Mot 1
[2]     Mot2
[3]     Mot 3
Nous avons donc un tableau contenant dans l'élément [0] le nombre total de ligne (sans la ligne 0), puis dans l'éléments [1] la chaine "Mot 1", dans l'élément [2] la chaine "Mot2" et dans l'élément [3] la chaine "Mot 3". Vous allez donc pouvoir faire une recherche pour chacun de ces éléments comme ceci :

Code : Tout sélectionner

$sAnswer = InputBox("Question", "Entrez vos recherches séparées par le caractère |", "", "")
$aAnswer = StringSplit($sAnswer, "|")

 ; Ici on vérifie que $aAnswer est bien un tableau, sinon le reste du code risque de faire planter le script.
If IsArray($aAnswer) Then

    ; On démarre la boucle de l'élément [1] au dernier puisque $aAnswer[0] contien le nombre total d'éléments.
    ; Généralement on utilise Ubound($Tableau) - 1 car Ubound renvoi le nombre total d'élément y compris l'élément [0].
    For $i = 1 To $aAnswer[0]

         ; $aAnswer[$i] sera tour a tour $aAnswer[1], $aAnswer[2] puis $aAnswer[3] puisque $i est incrémenté de 1 à chaque tour de boucle.
        MsgBox(32, "Info", "La chaine à rechercher est : " & $aAnswer[$i])

    ; Le next permet de continuer la boucle tant qu'elle n'est pas finie.
    Next

; EndIf termine la condition de "IsArray($aAnswer) Then"
EndIf
Voilà pour la première partie. ;)
Essayez de bien assimiler ceci en copiant les codes donnés et en les testant. On voit la suite dès que vous êtes prêt. :mrgreen:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
labougie
Niveau 4
Niveau 4
Messages : 68
Enregistré le : dim. 03 nov. 2013 14:36
Status : Hors ligne

Re: [..] Convertir mon batch en autoit

#13

Message par labougie »

Thierry,

Merci pour ces excellents compléments.

Je tâche de les digérer au plus vite et surtout au mieux.

labougie
Avatar du membre
labougie
Niveau 4
Niveau 4
Messages : 68
Enregistré le : dim. 03 nov. 2013 14:36
Status : Hors ligne

Re: [..] Convertir mon batch en autoit

#14

Message par labougie »

Le Z n'était là que pour indiquer l'emplacement de l'erreur, et, je l'ai indiqué dans mon post :wink: .

Le choix du délimiteur "Pipe", était une question à venir, et tu l'as devancer.
De ce fait cela solutionne le choix multiple des recherches.
En revanche, depuis l'utilisation de ton script, cette ligne ne se remplie plus.

FileWriteLine($LogFile,"=~=~=~=~=~=~=~=~=~=~=~=~ Recherche pour les Fichiers " & """ " & $answer & " """ & " =~=~=~=~=~=~=~=~=~=~=~=~")

En recherche simple (avec un seul mot, la variable était remplacée, ici ce n'est plus le cas.

Tu m'indiques que Ubound, comptabilise alors le nombre de résultat, peut on alors l'extraire du tableau ce résultat de la ligne [0] ?

Je parle de ce tableau suite à ton code, donc ici le chiffre 1 // Colonne 0

Image


Voici comment j'ai scripté la recherche, le hdd tourne bien, mais rien ne s'incrit dans logfile, de plus cela me semble extrêmement long pour un résultat qui ne sort pas.

Ce critère "*" & $answer & "*.*" permet une recherche de ce type *abou*.* pour labougie.* ou maboule.* en fait pour tout ce qui contient abou, afin de cibler très large.
► Afficher le texte
Labougie

edit ajout balise code
Modifié en dernier par labougie le jeu. 19 déc. 2013 22:59, modifié 1 fois.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Convertir mon batch en autoit

#15

Message par mikell »

Code : Tout sélectionner

Global $Recherche = _FileListToArrayEx ($k & "\", "*" & $answer & "*.*", 0, 2)
; _ArrayDisplay($Recherche)
Comme son nom l'indique _FileListToArrayEx retourne une liste des fichiers dans un tableau, résultat à vérifier avec _ArrayDisplay($Recherche)
Ce sont les lignes de ce tableau qui devront être écrites l'une après l'autre dans le log selon la méthode de lecture de tableau indiquée plus haut par Thierry

Code : Tout sélectionner

For $i = 1 to $Recherche[0]   ; parcourt le tableau
    FileWriteLine($LogFile, $Recherche[$i])
Next
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
labougie
Niveau 4
Niveau 4
Messages : 68
Enregistré le : dim. 03 nov. 2013 14:36
Status : Hors ligne

Re: [..] Convertir mon batch en autoit

#16

Message par labougie »

Mikell,

Merci pour ce complément.

Mon script ci-dessous, scan tous les disques, mais ne rapporte par le bon log.
Il liste tous les fichiers quelqu'ils soient.

Cette ligne:

Global $Recherche = (_FileListToArrayEx ($k & "\", "*" & $answer & "*.*", 0, 2))

est censée retourner pour le mot "Labougie", tous les fichiers contenant ce mot, et ce n'est pas le cas.
Quelle erreur est je commis?

Script
► Afficher le texte
Log
► Afficher le texte
labougie
Avatar du membre
TopXm
Niveau 6
Niveau 6
Messages : 260
Enregistré le : mer. 25 mai 2011 16:37
Localisation : Usa
Status : Hors ligne

Re: [..] Convertir mon batch en autoit

#17

Message par TopXm »

Salut :)

Normal tu fais ta fonction _FileListToArray sur $answer alors que c'est un tableau. Il te faut mettre
ta 1ere boucle dans la seconde. Quelque chose de ce genre (désolé je n'ai pas pu tester je ne trouve pas
l'include de la v3,j'aidonc testé sur _FileListToArrayEx)

Code : Tout sélectionner

Local $aArray = DriveGetDrive("ALL")
Local $sLabel = DriveGetLabel(@HomeDrive & "\")
Local $Recherche

For $k = 1 to $aArray[0]
    ;FileWriteLine($LogFile, "Volume Label: " & $sLabel)
    
    For $i = 1 To $answer[0]
        FileWriteLine($LogFile, "")
        FileWriteLine($LogFile, "")
        FileWriteLine($LogFile, "=~=~=~=~=~=~=~=~=~=~=~=~ Recherche pour les Fichiers Lecteur " & $aArray[$k] & """    " & $answer[$i] & " """ & " =~=~=~=~=~=~=~=~=~=~=~=~")
        FileWriteLine($LogFile, "")

        $Recherche = _FileListToArrayEx($aArray[$k] & "\", "*" & $answer[$i] & "*.*", 0)

        If IsArray($Recherche) Then

            For $i = 1 To $Recherche[0] ; parcourt le tableau
                FileWriteLine($LogFile, $Recherche[$i])

            Next
        EndIf
    Next
Next
 
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Convertir mon batch en autoit

#18

Message par mikell »

Tlem a écrit :Maintenant, dans ce code, la condition "If Exist $k" est totalement inutile puisque $aArray contient une liste de lecteurs existants (retourné par le DriveGetDrive()), il est donc inutile de tester quelque chose qui existe.
Heu pas d'accord :wink:
$aArray[0] contient le nombre de lecteurs donc une condition d'existence est nécessaire, mais dans ce cas comme DriveExists n'existe pas faut improviser ^^

Code : Tout sélectionner

If not FileExists($k & "\") Then casse-toi
ou
If IsNumber($k) Then casse-toi
De même, comme DriveGetDrive() retourne une liste de tous les lecteurs le code va planter quand il va tomber sur un lecteur CD vide
Et puis faut songer aux espaces blancs parasites qui peuvent être écrits dans l'inputbox avant ou après le mot à rechercher
Enfin comme ce type de recherche peut être long je conseille toujours de placer des SplashTextOn par-ci par-là pour rassurer l'utilisateur :mrgreen:

@labougie
TOUT ce dont tu as besoin a été mentionné dans les posts précédents
Si tu as encore des soucis je peux te mettre le script fini et commenté, mais c'est mieux si tu arrives à le finaliser tout seul :wink:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Convertir mon batch en autoit

#19

Message par Tlem »

Je me permet d'intervenir une fois de plus afin de clarifier certaines choses.

Si on part du principe de base, vous avez un tableau d'éléments à chercher et un tableau contenant la liste des disques dans lesquelles vous voulez chercher ces éléments.

En partant du code évoqué ci-dessus, si le premier tableau ne contient qu'un seul élément, la recherche sera 'classique', par contre, si il contient 5 éléments, la totalité des disques seront scannés 5 fois, ce qui n'est pas des plus optimal et risque fort d'être tréééééééés long ... :roll:

Je vous conseil donc l'utilisation d'une fonction de recherche qui permet la recherche multiple. _FileListToArrayEx() fait assez bien le boulot et c'est visiblement elle que vous avez choisit. ;)
Le gros avantage de cette fonction, c'est que vous pourrez pratiquement utiliser le retour de votre question sans passer par un tableau et une boucle supplémentaire. Mais pour cela, il va falloir modifier la chaine retournée par votre InputBox(). Si votre recherche ne contient qu'un seul élément, alors la chaine retournée sera de la forme "Chaine1" et donc il est simple de la modifier par *Chaine 1*", par contre en cas de recherche multiple, votre chaine de recherche aura la forme "Chaine 1|Chaine 2|Chaine3" et la c'est de suite moins simple ...
Pour pouvoir adapter cette chaine, on va simplement utiliser une fonction de remplacement de caractères d'AutoIt qui s'appelle StringReplace() et on va tout simplement remplacer le caractère de séparation "|" par "*|*" ce qui transformera la chaine "Chaine 1|Chaine 2|Chaine3" en "Chaine 1*|*Chaine 2*|*Chaine3". Il nous suffira de rajouter le caractère "*" au début et à la fin de la chaine pour obtenir le résultat escompté : "*Chaine 1*|*Chaine 2*|*Chaine3*".

Voici donc votre code adapté pour une partie de vos besoins :
► Afficher le texte
J'ai rajouté quelques notions supplémentaires, tel que la fonction, car elle permet de minimiser l'écriture de code pour générer votre rapport.
ShellExecute est plus approprié pour lancer un EXE.
Modifié en dernier par mikell le dim. 17 nov. 2013 23:42, modifié 1 fois.
Raison : balise spoiler
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Convertir mon batch en autoit

#20

Message par Tlem »

mikell a écrit :Heu pas d'accord :wink:
$aArray[0] contient le nombre de lecteurs donc une condition d'existence est nécessaire.
...
De même, comme DriveGetDrive() retourne une liste de tous les lecteurs le code va planter quand il va tomber sur un lecteur CD vide
Image

En temps normal oui, mais là la fonction _FileListToArrayEx ne renverra tout simplement rien. Il est clair que c'est plus propre, mais parfois la simplification d'un code ne nuit pas à sont fonctionnement. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Verrouillé