IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBScript Discussion :

Renommer des fichiers en supprimant les doublons


Sujet :

VBScript

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Mars 2008
    Messages : 8
    Points : 7
    Points
    7
    Par défaut Renommer des fichiers en supprimant les doublons
    Bonsoir à tous.

    Programmeur amateur depuis quelques années, je suis en train de découvrir le VBS. Je viens de développer un petit soft pour mon boulot et j'aimerais avoir votre avis.

    Voici le problème :

    - plusieurs utilisateurs enregistrent des messages (reçus avec Mozilla Thunderbird) sur un serveur via un lecteur réseau.
    - ces messages sont classés dans des dossiers et sous-dossiers en fonction de l'année, du mois, etc...
    - le niveau de l'arborescence n'est pas fixe, ils peuvent ajouter des sous-dossiers de sous-dossier à leur convenance.
    - il arrive qu'un message ait été transféré plusieurs fois avant de leur parvenir.
    - il arrive aussi qu'ils reçoivent plusieurs fois le même message avec des noms différents car il est passé par divers expéditeurs.

    on se retrouve donc avec quelque chose comme ça :

    MSG_RECUS
    ____2007
    ________janvier
    ____________mail_01
    ____________mail_02
    ____________[Fwd mail_03]
    ________février
    ____________[Fwd [Fwd [Fwd [Fwd mail_04]]]]
    ________septembre
    ____________mail_86
    ____________[Fwd mail_86] .......... (cet email a été modifié avant d'etre transféré)
    ____2008
    ________juillet
    ____________mail_145
    ____________[Fwd [Fwd mail_213]]
    ____________[Fwd [Fwd [Fwd mail_213]]]
    ____________mail_578

    Je me retrouve donc avec plusieurs problèmes :
    - quand un email est enregistré, l'objet de l'email est utilisé pour créer le nom du fichier ; étant donné que les expéditeurs mettent des objets explicites assez long, il arrive que le nom de fichier dépasse les 254 caractères ; ce qui implique des erreurs lors de la sauvegarde du serveur.
    - un même email peut donc être enregistré plusieurs fois (mais avec un nom différent).
    - un même email peut avoir été reçu plusieurs fois et comporter des modifications ; ce qui revient à avoir 2 emails différents.

    Je cherche donc à "trier" ces archives pour obtenir ça :

    MSG_RECUS
    ____2007
    ________janvier
    ____________mail_01
    ____________mail_02
    ____________mail_03
    ________février
    ____________mail_04
    ________septembre
    ____________mail_86
    ____________mail_86_date_heure .......... (on renomme ce fichier pour montrer qu'il est différent du précédent)
    ____2008
    ________juillet
    ____________mail_145
    ____________mail_213
    ____________mail_578

    Je me suis inspiré de morceaux de codes trouvés sur ce forum et voici ce que j'ai élaboré :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    Option Explicit
     
    Dim FSO, Fichier, Fichier_existe, Dossier, Sous_dossier, Ancien_nom, Nouveau_nom
    Dim Ctr_renomme, Ctr_supprime
    Dim Attributs_ancien, Attributs_nouveau, longueur_nom, Extension
    Dim jj, mm, aa, hh, mn
     
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Ctr_renomme = 0
    Ctr_supprime = 0
     
    ' On fait appel à la fonction pour parcourir les sous-dossiers à partir du chemin courant
    Parcourir FSO.GetFolder(".")
    ' On affiche le nombre de fichiers traités
    Wscript.Echo Ctr_renomme & " fichiers renommés" & vbcrlf & Ctr_supprime & " fichiers supprimés"
     
     
    Sub Parcourir(Nom_Dossier)
     
    	' On traite chaque sous-dossier à partir du dossier courant
    	For Each Sous_dossier in Nom_Dossier.SubFolders
     
    		'  On traite chaque fichier du sous-dossier
    		For each Fichier in  FSO.GetFolder(Sous_dossier.Path).Files
     
    			' On calcule la longueur du nom de fichier sans l'extension
    			longueur_nom = len(Fichier.Name) - 4
    			' On récupere l'ancien nom du fichier sans l'extension
    			Ancien_nom = Mid(Fichier.Name,1,longueur_nom)
    			' On récupere l'extension du fichier
    			Extension = "." & Mid(Fichier.Name,longueur_nom + 2,3)
     
    			' On enlève les caractères inutiles pour préparer le nouveau nom du fichier
    			Nouveau_nom = Replace(Ancien_nom,"Fwd ","")
    			Nouveau_nom = Replace(Nouveau_nom,"Fwd","")
    			Nouveau_nom = Replace(Nouveau_nom,"[ ","")
    			Nouveau_nom = Replace(Nouveau_nom,"[","")
    			Nouveau_nom = Replace(Nouveau_nom,"]","")
    			Nouveau_nom = Replace(Nouveau_nom,"  ","")
    			Nouveau_nom = Replace(Nouveau_nom,"..",".")
     
    			' On vérifie si le nom a changé
    			If Ancien_nom <> Nouveau_nom Then
     
    				' On récupère le nom du sous-dossier en cours
    				Set Dossier = fso.GetFolder(Sous_dossier.Path)
     
    				' On vérifie si un fichier existe déjà avec le nouveau nom de fichier
    				Fichier_existe = FSO.FileExists(Dossier & "\" & Nouveau_nom & Extension)
     
    				' Si un fichier existe déjà avec le nouveau nom de fichier
    				If Fichier_existe then
     
    					' On récupère la date de dernière modification du fichier avec l'ancien nom
    					Set Attributs_ancien = FSO.GetFile(Dossier & "\" & Ancien_nom & Extension)
     
    					' On récupère la date de dernière modification du fichier avec le nouveau nom
    					Set Attributs_nouveau = FSO.GetFile(Dossier & "\" & Nouveau_nom & Extension)
     
    					' On vérifie si le fichier a été modifié
    					If Attributs_ancien <> Attributs_nouveau Then
     
    						' On récupère la date et l'heure de dernière modification de l'ancien fichier
    						jj =  Mid(Attributs_ancien.DateLastModified, 1,2)
    						mm =  Mid(Attributs_ancien.DateLastModified, 4,2)
    						aa =  Mid(Attributs_ancien.DateLastModified, 7,4)
    						hh =  Mid(Attributs_ancien.DateLastModified, 12,2)
    						mn =  Mid(Attributs_ancien.DateLastModified, 15,2)
     
    						' On vérifie si un fichier existe déjà avec le nouveau nom de fichier concaténé
    						Fichier_existe = FSO.FileExists(Dossier & "\" & Nouveau_nom & "_" & aa & mm & jj & hh & mn & Extension)
     
    						' Si un fichier existe déjà avec le nouveau nom de fichier
    						If Fichier_existe then
     
    							' On supprime le fichier avec l'ancien nom
    							FSO.DeleteFile (Dossier & "\" & Ancien_nom & Extension)
     
    							' On incrémente le compteur de fichiers supprimés
    							Ctr_supprime = Ctr_supprime + 1
     
    						' Si aucun fichier existe avec le nouveau nom de fichier concaténé
    						Else
     
    							' On renomme l'ancien fichier avec le nouveau nom concaténé avec sa date de dernière modification
    							FSO.MoveFile (Dossier & "\" & Ancien_nom & Extension) , (Dossier & "\" & Nouveau_nom & "_" & aa & mm & jj & hh & mn & Extension)
     
    							' On incrémente le compteur de fichiers renommés
    							Ctr_renomme = Ctr_renomme + 1
     
    						End If
     
    					' Mais s'il n'a pas été modifié
    					Else
     
    						' On supprime le fichier avec l'ancien nom
    						FSO.DeleteFile (Dossier & "\" & Ancien_nom & Extension)
     
    						' On incrémente le compteur de fichiers supprimés
    						Ctr_supprime = Ctr_supprime + 1
     
    					End If
     
    				' Si aucun fichier existe avec le nouveau nom de fichier
    				Else
     
    					' On renomme le fichier avec le nouveau nom
    					FSO.MoveFile (Dossier & "\" & Ancien_nom & Extension) , (Dossier & "\" & Nouveau_nom & Extension)
     
    					' On incrémente le compteur de fichiers renommés
    					Ctr_renomme = Ctr_renomme + 1
     
    				End If
     
    			End If
     
    		Next
     
    		' On refait appel à la fonction pour parcourir les sous-dossiers à partir du chemin courant <==> effet recursif.....
    		Parcourir Sous_dossier
     
    	Next
     
    End Sub
    Si vous avez des idées pour optimiser ou des critiques à émettre, je suis toute ouïe.

    Merci d'avance !

  2. #2
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Bien codé, bien commenté, bien indenté que dire de plus ?
    Pour l'optimisation il faudrait vraiment se plonger dans ton projet pour vraiment te conseiller correctement.

    En tout cas du coup cela fait une bonne contribution

    Sinon as tu des problèmes avec ce script ?

    Peut être ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ' On enlève les caractères inutiles pour préparer le nouveau nom du fichier
    			Nouveau_nom = Replace(Ancien_nom,"Fwd ","")
    			Nouveau_nom = Replace(Nouveau_nom,"Fwd","")
    			Nouveau_nom = Replace(Nouveau_nom,"[ ","")
    			Nouveau_nom = Replace(Nouveau_nom,"[","")
    			Nouveau_nom = Replace(Nouveau_nom,"]","")
    			Nouveau_nom = Replace(Nouveau_nom,"  ","")
    			Nouveau_nom = Replace(Nouveau_nom,"..",".")
    Peut être qu'il serait intéressant de mettre tout ces string dans un fichier, un ensembles de caractères inutiles par ligne, et de faire une fonction replace qui ouvre le fichier et le parcours ligne pr ligne pour faire le replace.

    Dans le fichier tu pourrais faire une structure ainsi :
    caratère à remplacer;nouveau caractère.
    Avec la fonction split cela serait facilement gérable.

    Ce ne serais pas plus rapide, c'est juste que cela te permettrais de facilement àjouter de nouveau caractères à supprimer.
    Et tu pourrais faire un deuxième scripts, peut être un formulaire internet (en HTA par exemple) pour ajouter dans ce fichier des caractères (afin que personne ne fasse de bétise en éditant le fichier).


    Voilà c tout ce que j'ai à dire.

    @ si bon boulot

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Mars 2008
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Merci pour l'idée, je vais me pencher dessus.

    Aujourd'hui, j'ai modifié le script pour afficher une fenetre pour faire patienter l'utilisateur pendant l'exécution du programme.
    J'avais commencé par une Msgbox mais je me suis rabattu sur une fenêtre IE (afin de pouvoir la fermer automatiquement à la fin du traitement).

    Par contre, j'aimerais afficher le dossier en cours de traitement dans cette fenêtre et la mettre à jour au fur et à mesure.
    J'ai cherché sur différents forums mais je n'ai pas trouvé grand chose.

    Est-ce qu'il est possible de modifier un champ texte (ou autre) et faire un rafraîchissement de la fenêtre IE déjà affichée depuis une procédure VBS ?

  4. #4
    Membre averti
    Inscrit en
    Août 2007
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Août 2007
    Messages : 302
    Points : 341
    Points
    341
    Par défaut
    Salut,

    pour afficher des infos au fur et mesure de ton VBS dans une fenetre IE, voici comment je procède :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
        Set objExplorer = WScript.CreateObject ("InternetExplorer.Application")
        objExplorer.Navigate "about:blank"
        objExplorer.ToolBar = 0
        objExplorer.StatusBar = 0
        objExplorer.Width = 600
        objExplorer.Height = 800
        objExplorer.Left = 20
        objExplorer.Top = 20
        objExplorer.Visible = 1
     
        ' Temporisation
        Do While (objExplorer.Busy)
           Wscript.Sleep 500
        Loop
     
        For I=1 to 10
            objExplorer.Document.WriteLn "<br>"
            objExplorer.Document.WriteLn vbTab & "Dossier N° :" & I
        Next
    Par contre si tu veux modifer un champ directement dans IE avec cette méthode, je ne sais pas comment procéder à moins de procéder avec un HTA.

    A++

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Mars 2008
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Bonsoir

    Si j'ai bien compris ta méthode RadPAT, tu rajoutes les lignes les unes à la suite des autres dans la page, ce qui fait qu'elle s'aggrandit au fur et à mesure du traitement...

    Je vais essayer, mais ce qui me fait peur, c'est qu'il y a une bonne centaine de dossiers au total, donc la page risque d'être assez longue...

    Au fait, c'est possible de centrer la fenêtre IE en fonction de la résolution de l'écran ? Est-ce qu'on peut récupérer les propriétés de l'affichage en VBS ou il faut passer par un moyen intermédiaire ? =====> j'ai trouvé pour l'affichage...

  6. #6
    Membre averti
    Inscrit en
    Août 2007
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Août 2007
    Messages : 302
    Points : 341
    Points
    341
    Par défaut
    Salut,


    Effectivement, les lignes s'ajoutent au fur et à mesure dans la fentre, mais comme il y a une hauteur de fixée, la fenetre ne s'agrandit pas pour autant. Par contre, tu auras un ascenseur pour naviguer dedans
    Pour centrer la fenetre sur l'écran, voici comment je fais pour les HTA :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colItems = objWMIService.ExecQuery("Select * From Win32_DesktopMonitor")
    For Each objItem in colItems
        intHorizontal = objItem.ScreenWidth
        intVertical = objItem.ScreenHeight
    Next
     
    XPos = 550
    YPos = 470
     
    intLeft = (intHorizontal - XPos) / 2
    intTop = (intVertical - YPos) / 2
     
    self.ResizeTo Xpos,YPos
    window.moveTo intLeft, intTop

    Le WMI sert à récupérer la résolution de l'écran.
    XPos c'est la largeur de ta fenetre et YPos sa hauteur. Du coup on prend la largeur totale de l'écran moins la largeur de la fenetre et on divise par 2 pour bien centrer tout ca. Meme chose avec la hauteur.

    A++

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/01/2014, 13h04
  2. [Batch] Problème : renommer des fichiers (en supprimant une partie fixe)
    Par VforVincent dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 03/06/2011, 21h02
  3. Réponses: 2
    Dernier message: 15/05/2009, 15h07
  4. Lire des fichiers et effacer les doublons
    Par Saten dans le forum Windows Forms
    Réponses: 1
    Dernier message: 12/11/2008, 17h18
  5. Réponses: 2
    Dernier message: 21/02/2008, 12h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo