Recherche d'une chaîne de caractère dans plusieurs fichiers

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Kreg
Niveau 1
Niveau 1
Messages : 11
Enregistré le : jeu. 06 juin 2013 10:00
Status : Hors ligne

Recherche d'une chaîne de caractère dans plusieurs fichiers

#1

Message par Kreg »

Hello la compagnie!

Je dois ajouter un message spécial dans des signatures outlook pour mes utilisateurs.
C'est facile pour ajouter le message. En 2 ligne c'est réglé, le script va dans le répertoire qui va bien et ajoute la phrase qui va bien au bon endroit dans le ou les signatures présentes dans le répertoire.
En revanche, je souhaiterais que ce message ne soit pas ajouté plusieurs si jamais le script est lancé plusieurs fois. Donc ajouter une vérification pour voir si la phrase en question n'est pas déjà présente dans les fichiers HTML (j'ai plusieurs signatures par poste).

Et c'est là mon problème, ma fonction de recherche s'arrête si la phrase est présente dans le 1er fichier trouvé, mais ne cherche pas dans le suivant.
Ca ne correspond donc pas à mon besoin.
Je veux vraiment ajouter cette phrase à tous les fichiers HTML, mais uniquement une fois :)

Ci-dessous mon code :
Qu'est-ce qui n'est pas bon à votre avis ?

Code : Tout sélectionner

$sFind = "</div>"
$sFilename = _FileListToArray(@AppDataDir & "\Microsoft\Signatures\", "*.htm", 1, True)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
For $i = 1 To $sFilename[0]
$search = "If you read this message, you are the winner"
Global $iLine = 0, $sLine = '', $iValid = 0
$hFile = FileOpen($sFilename[$i])

; find the line that has the search string
While 1
    $iLine += 1
    $sLine = FileReadLine($hFile)
    If @error = -1 Then ExitLoop

    ; test the line for the $search string until the flag $iValid is set
    If StringInStr($sLine, $search) And Not $iValid Then
        $iValid = 1
        ContinueLoop
    EndIf

    If $iValid Then
        $iValid += 1
        ConsoleWrite($iLine & ':' & $sLine & @CRLF)
        If $iValid = 1 Then ExitLoop
            Exit
    EndIf
WEnd
FileClose($hFile)
Next

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


For $i = 1 To $sFilename[0]

$iMsg = @CRLF
$iMsg &="<p class=MsoNormal style='margin-bottom:12.0pt'><span style='font-size:14.0pt;font-family:""Lucida Sans Unicode"";color:black'>If you read this message, you are the winner....</span></p>" & @CRLF
$iMsg &= "</div>" & @CRLF

$iRetval = _ReplaceStringInFile($sFilename[$i], $sFind, $iMsg)

Next
Merci !
Kreg
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: Recherche d'une chaîne de caractère dans plusieurs fichiers

#2

Message par walkson »

Je n'ai pas testé votre code mais il me semble que "exit" aurait du être "exitloop" dans
    If $iValid Then
        $iValid += 1
        ConsoleWrite($iLine & ':' & $sLine & @CRLF)
        If $iValid = 1 Then ExitLoop
            Exit
    EndIf
Une remarque: il ne serait pas plus simple d'enregistrer les destinataires quand ils ont reçu votre premier message (sur un Ini par exemple) afin d'éviter le doublon
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
TomAijerrie
Niveau 5
Niveau 5
Messages : 192
Enregistré le : lun. 02 juin 2014 09:55
Localisation : Lyon
Status : Hors ligne

Re: Recherche d'une chaîne de caractère dans plusieurs fichiers

#3

Message par TomAijerrie »

Il y a une autre erreur dans ce bout de code, au début on vérifie que $iValid est vrai (n'est pas nul, donc différent de 0)
Ensuite, on l'incrémente de 1, il est donc forcément différent de 1
Et juste après, on demande de faire un truc (Exitloop) si il vaut 1, ce qui n'arrivera jamais...

Je n'ai pas regardé le code en entier non plus, mais il y a effectivement quelque chose à corriger ici.
Kreg
Niveau 1
Niveau 1
Messages : 11
Enregistré le : jeu. 06 juin 2013 10:00
Status : Hors ligne

Re: Recherche d'une chaîne de caractère dans plusieurs fichiers

#4

Message par Kreg »

Hello !
Merci pour vos retours :)
J'ai enlevé mon "Exit" de trop, et j'ai également modifié mon $iValid.
C'est pas mieux, le script ajoute la ligne à chaque fois qu'il est lancé :(

Ca ressemble à ça :

Code : Tout sélectionner

For $i = 1 To $sFilename[0]
	$search = "Si vous recevez ce message pendant votre période de repos"
	Global $iLine = 0, $sLine = '', $iValid = 0
	$hFile = FileOpen($sFilename[$i])

	; find the line that has the search string
	While 1
		$iLine += 1
		$sLine = FileReadLine($hFile)
		If @error = -1 Then ExitLoop

		; test the line for the $search string until the flag $iValid is set
		If StringInStr($sLine, $search) And Not $iValid Then
			$iValid = 1
			ContinueLoop
		EndIf

		If $iValid Then
			$iValid += 1
			ConsoleWrite($iLine & ':' & $sLine & @CRLF)
			If $iValid > 1 Then ExitLoop
		EndIf
	WEnd
	FileClose($hFile)
Next
NB : Je vais etudier la solution de flag sur un fichier. Effectivement c'est peut être la meilleure des solutions...
Merci
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: Recherche d'une chaîne de caractère dans plusieurs fichiers  

#5

Message par walkson »

Et comme ça ?
#include <File.au3>


Global $sFind = "</div>"
Global $sFilename = _FileListToArray(@AppDataDir & "\Microsoft\Signatures\", "*.htm", 1, True)
Global $search = "If you read this message, you are the winner...."

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
For $i = 1 To $sFilename[0]

Global $iLine = 0, $sLine = '', $iValid = 0
$hFile = FileOpen($sFilename[$i])
    $sLine = FileRead($hFile)
    If @error  Then ExitLoop
    If StringInStr($sLine, $search) = 0 Then
      Modif($sFilename[$i])
      ConsoleWrite("modif" & @CR)
   Else
      ConsoleWrite("out" & @CR)
    EndIf
FileClose($hFile)
Next

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Func Modif($bFilename)
$iMsg = @CRLF
$iMsg &="<p class=MsoNormal style='margin-bottom:12.0pt'><span style='font-size:14.0pt;font-family:""Lucida Sans Unicode"";color:black'>If you read this message, you are the winner....</span></p>" & @CRLF
$iMsg &= "</div>" & @CRLF
ConsoleWrite($sFilename & @CR)
$iRetval = _ReplaceStringInFile($bFilename, $sFind, $iMsg)
ConsoleWrite($iRetval & @CR)
EndFunc
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Kreg
Niveau 1
Niveau 1
Messages : 11
Enregistré le : jeu. 06 juin 2013 10:00
Status : Hors ligne

Re: Recherche d'une chaîne de caractère dans plusieurs fichiers

#6

Message par Kreg »

walkson a écrit : jeu. 28 sept. 2017 18:39 Et comme ça ?
#include <File.au3>


Global $sFind = "</div>"
Global $sFilename = _FileListToArray(@AppDataDir & "\Microsoft\Signatures\", "*.htm", 1, True)
Global $search = "If you read this message, you are the winner...."

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
For $i = 1 To $sFilename[0]

Global $iLine = 0, $sLine = '', $iValid = 0
$hFile = FileOpen($sFilename[$i])
    $sLine = FileRead($hFile)
    If @error  Then ExitLoop
    If StringInStr($sLine, $search) = 0 Then
      Modif($sFilename[$i])
      ConsoleWrite("modif" & @CR)
   Else
      ConsoleWrite("out" & @CR)
    EndIf
FileClose($hFile)
Next

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Func Modif($bFilename)
$iMsg = @CRLF
$iMsg &="<p class=MsoNormal style='margin-bottom:12.0pt'><span style='font-size:14.0pt;font-family:""Lucida Sans Unicode"";color:black'>If you read this message, you are the winner....</span></p>" & @CRLF
$iMsg &= "</div>" & @CRLF
ConsoleWrite($sFilename & @CR)
$iRetval = _ReplaceStringInFile($bFilename, $sFind, $iMsg)
ConsoleWrite($iRetval & @CR)
EndFunc
Tout simplement parfait !
Un grand merci Walkson :) fonctionne impec!

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

Re: Recherche d'une chaîne de caractère dans plusieurs fichiers

#7

Message par mikell »

Et en faisant carrément simple ça irait pas ?
#include <File.au3>

$sFilename = _FileListToArray(@AppDataDir & "\Microsoft\Signatures\", "*.htm", 1, True)

$sFind = "</div>"
$search = "If you read this message, you are the winner...."
$iMsg = @CRLF & "<p class=MsoNormal style='margin-bottom:12.0pt'><span style='font-size:14.0pt;font-family:""Lucida Sans Unicode"";color:black'>" & $search & "</span></p>" & @CRLF & $sFind & @CRLF

For $i = 1 To $sFilename[0]
    $txt = FileRead($sFilename[$i])
    If @error = -1 Then ContinueLoop
    If not StringInStr($txt, $search) Then
                _ReplaceStringInFile($sFilename[$i], $sFind, $iMsg)
                ConsoleWrite("modif" & @CR)
        Else
                ConsoleWrite("out" & @CR)
    EndIf
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
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: Recherche d'une chaîne de caractère dans plusieurs fichiers

#8

Message par walkson »

J'adore quand on passe derrière moi
J'ai l'impression d'être défroissé et hop, un coup de fer !
Merci Mikell, si je progresse ! :bisou:
Proverbe du jour: "Rien ne sert d'être émérite si on ne progresse pas" (même sur les choses simples)
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: Recherche d'une chaîne de caractère dans plusieurs fichiers

#9

Message par mikell »

Allons allons
C'était juste histoire de faire remarquer à Kreg que le FileOpen/FileClose était malvenu, et que le script pouvait être fait un peu plus compact, c'est tout :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 )
Répondre